启动数据库到windows服务
mongod --dbpath D:\ProgramFiles\MongoDB\db --logpath D:\ProgramFiles\MongoDB\log\m17.log --port 27017 --serviceName MongoDB --install
fork后台运行,3.6版本fork命令不支持了
默认端口27017
命令行远程登录
mongo.exe ip:端口/db名称 -u用户名 -p
然后输入用户的密码
du -h linux下查看磁盘占用
bsondump 导出bson结构
mongo 客户端(相当于mysqlexe)
mogod服务器端(相当于mysqldexe)
mongoexport导出易识别的json或csv
mongorestore数据库整体导入
mongos路由器分片
mongodb入门命令
1.查看当前数据库 show dbs;
admin
config
local
原始库就好别乱动
2.use databaseName;选库
3.show tables/collections;显示数据库表
mongodb的表叫collections
4.如何创建库,可以用db.help()查看命令,查不到
Mongodb的库是隐式创建的,你可以use一个不存在的库
然后在该库下创建collection,即可创建库
5.db.createCollection("collectionName") 创建数据表
例子
use shop
show collections
db.createCollection('user');
show dbs;
其实collections允许隐式创建 db.collectionName.insert("")
db.goods.insert({_id:1,name:'NOKIAN86',price:'29.9'});
6.插入和查询
db.user.insert({name:'lisi',age:22}) //主键自动生成
db.user.find();
db.user.insert({_id:2,name:'poly',age:22}) // 自定义主键
db.user.insert({_id:3,name:'hmm',bobby:['basketball','football'],intro:{'title':'My intro',content:'from china'}});
db.stu.insert([{_id:3,sn:"003",name:"lis"},{_id:4,sn:"004",name:"zhaowu"}]) //插入多条,id可以指定部分
7.db.user.drop(); 删除collection
8.db.dropDatabase(); 删除数据库,谨慎使用
详细的curd
1.删除
db.stu.remove({sn:'001'});
db.stu.remove();//清空
db.stu.insert([{name:'songjiang',gender:'m'},{name:'dalang',gender:'m'},{name:'poxi',gender:'f'},{name:'jinlin',gender:'f'}])
db.stu.remove({gender:'f'}) //删除所有匹配行
db.stu.remove({gender:'f'},true) // 删除一行
2.改 update操作
改谁?查询表达式
改成怎么样?--新值或赋值表达式
操作选项--可选参数
修改整个文档
db.stu.update({name:'dalang'},{'name':'wudalang'})
如果是想修改文档的某列,可以用$set关键字
db.collectionName.update(query,{$set:{name:'QQ'}})
$set 修改某个列的值
$unset删除某个列
$rename 重命名某个列
$inc 增长某个列的值
例子
db.stu.insert({
name:'wukong',
jinggu:true,
gender:'f',
age:500
})
db.stu.update({name:'wukong'},{$set:{name:'dzsf'}},{$unset:{jinggu:1}},{$rename:{gender:'sex'}},{$inc:{age:1}})
第三个参数
(upsert:true/false,multi:true/false)
Upsert--是指有没有匹配行,则直接插入该行(和mysql中的replace一样)
db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true})
$setOnInsert当upsert为true时,并且发生了insert操作时,可以补充的字段 2.4版本有的命令
db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'},$setOnInsert:{gender:'男'}},{upsert:true})
multi--改多行,用这个选项
例
db.news.update({age:21},{$set:{age:22}},{multi:true})
则把news中所有age=21的文档都修改
11.查 findOne find
db.stu.find() 查询所有文档
db.stu.find({},{gender:1,_id:0}) // id默认是查询出来的,查询所有文档的gender属性,并且不查询_id熟悉
db.stu.find({gender:'m'},{name:1,_id:0}) // 查询所有gender属性值为m的文档中的name属性
深入查询表达式
$ne --- != 不等于
{filed:($nq:value)}
例子
db.stu.find({_id:{$ne:3}},{name:1,sn:1}) 查询出id不等于3的文档的name和sn的列
$gt > 大于
db.stu.find({age:{$gt:500}},{name:1,_id:1}) 查询年龄大于500的所有文档的name和id列
$gte >= 大于等于
$in
db.stu.find({_id:{$in:[2,3]}}) 查找出id=2,3的列
$nin
db.stu.find({_id:{$nin:[2,3]}})
$lt <
$lte <=
$nin --not in
$all 指所有单元匹配
db.stu.find({hobby:{$all:['足球','篮球','冰球']}},{_id:1}) //查询出所有的hobby里有三个爱好为足球,篮球,冰球的并且只返回_id列
$or --or
db.stu.find({$or:[{age:{$gte:500}},{age:{$lte:512}}]})
满足一个即可
$and --and
查询age>=500 and age<=532
db.stu.find({$and:[{age:{$gte:500}},{age:{$lte:532}}]}) //lte可以换成其他表达式
$not --not 自己试一下
$nor 无对应项,指所有列举条件都不应成功则为真
db.stu.find({$nor:[{age:{$gte:500}},{age:{$lte:512}}]})
$exists 某列存在则为真
db.stu.find({age:{$exists:1}}); // 含有age属性的列查询出来
$mod 满足求余条件则为真
db.stu.find({_id:{$mod:[2,0]}}) // 查询id mod2 =0的列
$type 数据为某些类型则为真
$where
db.stu.find({$where:'this.age>500'},{name:1,age:1})
db.stu.find({$where:'this.age>500 && this.age < 510'},{name:1,age:1}) //还可以用&&
$regex
/^诺基亚.*/ 没有起效
游标操作
游标的操作
游标,不是查询结果,而是查询的返回资源,或者接口
通过接口,你可以逐条读取
就像php中的fopen打开文件,得到一个资源一样,通过资源,可以一行一行的读取
var mycursor = db.bar.find();
mycursor.next();
print(mycursor.next());
//插入
for(var i =0; i < 100 ; i++){
db.bar.insert({_id:i+1,title:'hello world',content:'aaa'+i})
}
//循环游标
var mycursor = db.bar.find();
mycursor.next();
for(var doc = true;mycursor.hasNext();){
printjson(mycursor.next());
}
var mycursor = db.bar.find();
while(mycursor.hasNext()){
printjson(mycursor.next());
}
var mycursor = db.bar.find();
mycursor.forEach(function(obj){printjson(obj)})
db.bar.find().count();
db.bar.find();
游标在分页中的使用,
比如查到1000行,跳过100页,取10行
一般地,我们假设每页N行,当前是page页
就需要跳过前(page-1)*N行,再取N行,在mysql中,limit offset,N来实现
在mongo中,使用skip,limit函数
var cursor = db.bar.find().skip(95);
cursor.forEach(function(obj){printjson(obj)})
每页2条
var cursor = db.bar.find().skip(95).limit(2);
cursor.forEach(function(obj){printjson(obj)})
通过cursor一次性得到所有数据,并返回数组,数据少的时候可以这样,因为会把数据以对象形式组织在内存里面
var cursor = db.bar.find().limit(10);
cursor.toArray()
//看到第二行
var cursor = db.bar.find().limit(10);
cursor.toArray()[2]
索引
索引创建
1.索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引
2.在mongodb中索引可以按字段升序/降序来创建,便于排序
3.默认是用btree来组织索引文件,2.4版本以后,允许建立hash索引
常用命令
查看当前索引状态:db.collection.getIndexs();
创建普通的单列索引:db.collection.ensureIndex(field:1/-1);
创建多列索引 db.collection.ensureIndex({field:1/-1,field2:1/-1})
创建子文档索引
db.collection.ensureIndex({filed.subfield:1/-1});
创建唯一索引
db.collection.ensureIndex({})
//分析执行计划
db.stu.find({sn:002}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "shop.stu",
"indexFilterSet" : false,
"parsedQuery" : {
"sn" : {
"$eq" : 2
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"sn" : {
"$eq" : 2
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "80276649-OAPC",
"port" : 27017,
"version" : "3.6.12",
"gitVersion" : "c2b9acad0248ca06b14ef1640734b5d0595b55f1"
},
"ok" : 1
}
--建立单列索引 1是升序,2是降序
db.stu.ensureIndex({sn:1})
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "shop.stu",
"indexFilterSet" : false,
"parsedQuery" : {
"sn" : {
"$eq" : 2
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"sn" : {
"$eq" : 2
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "80276649-OAPC",
"port" : 27017,
"version" : "3.6.12",
"gitVersion" : "c2b9acad0248ca06b14ef1640734b5d0595b55f1"
},
"ok" : 1
}
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "shop.stu",
"indexFilterSet" : false,
"parsedQuery" : {
"sn" : {
"$eq" : 2
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"sn" : 1
},
"indexName" : "sn_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"sn" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"sn" : [
"[2.0, 2.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "80276649-OAPC",
"port" : 27017,
"version" : "3.6.12",
"gitVersion" : "c2b9acad0248ca06b14ef1640734b5d0595b55f1"
},
"ok" : 1
}
-- 查看索引
db.stu.getIndexs()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "shop.stu"
},
{
"v" : 2,
"key" : {
"sn" : 1
},
"name" : "sn_1",
"ns" : "shop.stu"
}
]
--删除索引
db.stu.dropIndex({sn:1})
--添加多列索引
db.stu.ensureIndex({sn:1,name:1})
db.stu.getIndexes()
--添加子文档索引
db.shop.insert({name:'Nokia',spc:{weight:120,area:'taiwan'}})
db.shop.insert({name:'sanxing',spc:{weight:100,area:'hangguo'}})
db.shop.find({'spc.area':'taiwan'})
db.shop.ensureIndex({'spc.area':1})