.查询
(1)find()
基本格式:
db.集合.find({筛选条件}, {返回字段})
查询符合条件的信息,如果没有加入条件,默认查询集合里所有信息,返回字段代表只返回的内容(默认_id
字段一定会返回,如果不希望返回_id
,则设置_id:0
),0
代表不返回这些字段,1
代表只返回这些字段,举例:
> db.news.find();#查询news集合里的所有信息> db.news.find({"new" : "aaa" }); { "_id" : ObjectId("5b4b007eab406006cc8230cb"), "new" : "aaa" }#查询news集合里有:{"new" : "aaa" }键值对的数据> db.news.find({_id:1, abc:2}); { "_id" : 1, "new" : [ "aaa" ], "abc" : 2 }#查询news集合里有:{_id:1, abc:2}键值对的数据> db.aaa.find({"aaa":"aaa"}, {"bbb":0}) { "_id" : ObjectId("5ba25ee3be821c8cafbbdadb"), "aaa" : "aaa", "ccc" : "eee" } { "_id" : ObjectId("5ba25f00be821c8cafbbdadd"), "aaa" : "aaa", "ccc" : "eee" }#查询aaa集合里有{"aaa":"aaa"}的内容,返回的结果不包含"bbb"字段> db.aaa.find({"aaa":"aaa"}, {"bbb":1}) { "_id" : ObjectId("5ba25ee3be821c8cafbbdadb"), "bbb" : "ddd" } { "_id" : ObjectId("5ba25f00be821c8cafbbdadd"), "bbb" : "bbb" }#查询aaa集合里有{"aaa":"aaa"}的内容,返回的结果只有_id和"bbb"字段> db.aaa.find({}, {"bbb":1})#查询aaa集合里所有数据,返回的结果只有_id和"bbb"字段
注:筛选条件里有键值冲突时,如:{name:"111",name:"aaa"}
,则后一个会将前一个覆盖,即只会按后一个条件进行筛选
(2)findOne()
基本格式:
db.集合.findOne({筛选条件})
查询,可选是否填键值对条件,不填默认集合里第一条,举例:
> db.news.findOne();#查询news集合里的第一条数据> db.aaa.findOne({"aaa":"aaa"})#查询news集合里含{"aaa":"aaa"}键值对的第一条数据
2.修改
(1)update({},{})
基本格式:
db.集合.update({筛选条件}, {更新的数据})
匹配符合的数据,然后将内容更新成{更新的数据}里的内容,举例:
> db.news.update({_id:1},{"qqq":"ccc", aaa:"kkk"}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })#将_id为1的数据更新内容为:{"qqq":"ccc", aaa:"kkk"},即将原来内容覆盖
上面是根据_id
来筛选数据并更新的,如果是根据其他不唯一的键值对来更新时,其并不会对全部符合条件的都更新,而是只更新第一个符合条件的数据。
(2)update({},{$set:{}})
基本格式:
db.集合.update({筛选条件}, {$set:{修改的数据}})
匹配符合的数据,修改里面的键值对,存在的键值对就修改值,不存在的就新添值,举例:
> db.aaa.update({"aaa":"aaa"}, {$set:{"ccc":"cccd","ddd":"bbb"}})#此时含有{"aaa":"aaa"}键值对的第一条数据假如内容为:{"aaa":"aaa", "ccc":"aaa"}#那么修改后就为:{"aaa":"aaa", "ccc":"cccd","ddd":"bbb"},即和更新不同,不会覆盖原内容
(3)update({},{},0,0)
基本格式:
db.集合.update({筛选条件}, {更新的数据}, 0/1, 0/1)
格式1里只能更新匹配到的第一条数据,如果要全部更新的话,就要用到格式2,update()方法里有四个参数,除了前两个必须的(筛选的数据和更新成的数据),第三个参数代表当没有符合的数据时是否新增数据,1代表新增,0代表不增;第四个参数代表匹配到多个符合的数据时,是否全部更新,0代表只更新第一条,1代表全部更新,两个参数都默认值为0,举例:
> db.news.update({bbbb:"sadas"},{$set: {bbbb:"qqqqq"}}, 0, 1) WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })#匹配符合{bbbb:"sadas"}的数据,没查到就不新增(相当于没发生啥),查到就全部修改,可以看到结果集里匹配到了3个,修改了3个
(4)update({},{},{upsert:true})
基本格式:
db.集合.update({筛选条件}, {更新的数据},{upsert:true})
虽然也是对数据进行更新,但是由于有upsert
参数(update+insert,默认为false),所以当要修改的数据不存在时就追加,存在时就更新(原来数据不存在时相当于什么都没发生),举例:
> db.aaa.update({_id:"4"}, {"bbc":"lll"}, {upsert:true})#原来没有_id为"4"的,此时就添加一条{_id:"4", "bbc":"lll"}记录
3.插入
(1)insert()
基本格式:
db.集合.insert({添加的数据})
举例:
> db.collection1.insert({name:"aaa",age:20}) WriteResult({ "nInserted" : 1 })#往集合collection1里插入数据,如果不存在该集合就创建一个
4.删除
(1)remove()
基本格式:
db.集合.remove({删除的数据条件})
删除集合里符合条件的数据,举例:
> db.aaa.remove({"aaa":"ccc"}) WriteResult({ "nRemoved" : 3 })#把含有{"aaa":"ccc"}键值对的数据都删了
注:每句按分号隔离,单句没有分号也能执行,但是加分号更好
5.索引
(1)createIndex()
基本格式:
db.集合. createIndex({字段:1})
为字段建立普通索引,1
代表数据以该索引字段进行升序排序,-1
代表降序,举例:
db.aaa. createIndex({age:1}) #为age字段建立普通索引,并升序排序
注:ensureIndex()
是3.0.0版本前创建索引方法,现在也还能用
(2)createIndex({},{})
基本格式:
db.集合. createIndex({字段:1},{unique:true})
为字段建立唯一索引,建立后,该字段的值都不能有重复,举例:
db.aaa. createIndex({age:1},{unique:true}) #为age字段建立唯一索引,之后所有的age都不能相同
(3)getIndexes()
基本格式:
db.集合.getIndexes()
获取当前集合的所有索引,举例:
> db.aaa.getIndexes() #获取集合aaa的所有索引
(4)dropIndex()
基本格式:
db.集合. dropIndex ({字段:1})
将字段索引删除,举例:
db.aaa. dropIndex ({age:1}) #里面的字段和值要和创建索引时的一样才行,比如创建索引里是{age:100},那这里删除索引时括号里也要是{age:100}
6.语句示范
(1)逻辑操作
> db.aaa.find({"_id": {$gte: 1}}) { "_id" : 2, "aaa" : -7, "rank" : 0.6, "lll" : "ddd" } { "_id" : 3, "bbc" : "lll" }#_id大于等于1> db.aaa.find({$or:[{"title":/^a/}, {"title":/^b/}]})#"title"字段开头为a或b的> db.aaa.find({title:{$in: ["abc3","abc5", "abc100"]}})#"title"字段值为["abc3","abc5", "abc100"]这三个之一的> db.aaa.find({"title":{$exists:true}})#只要有"title"字段的都展示
(2)运算操作
像前面的加、乘、改名、新增/修改字段、删除字段等语法一般都是结合update
使用,举例:
> db.aaa.update({_id:"2"}, {$inc:{aaa:-3}, $mul:{rank:5}})#aaa字段值加3,rank字段值乘5> db.aaa.update({_id:"2"}, {$inc:{aaa:-3}, $mul:{rank:1/5}})#...减3,...除5> db.aaa.update({_id:"2"}, {$rename:{"bbb":"lll"}})#将bbb字段改名为"lll"> db.aaa.find({_id:"2"}) { "_id" : "2", "aaa" : 2, "bbb" : "ddd", "ccc" : "eee" }#原本数据> db.aaa.update({_id:"2"}, {$set:{aaa:2,rank:3}, $unset:{"ccc":true}})#修改aaa字段,添加rank字段,删除ccc字段> db.aaa.find({_id:"2"}) { "_id" : "2", "aaa" : 2, "bbb" : "ddd", "rank" : 3 }#修改后数据
(3)for
Mongodb语言和js语言相似,所以也可以使用for循环这类语句,举例:
> for(i = 5; i<10 ; i++){db.aaa.insert({"title":"abc"+i})}
(4)if
判断语句,举例:
> for(i = 50; i<100 ; i++){if(i==66){db.aaa.insert({"title":"abc"+i})}}
(5)正则表达式
> db.aaa.find({"title":/./})#找含有"title"字段,值为任意的> db.aaa.find({"title":/\d\d/})#找含有"title"字段,值中有连续两个数字的> db.aaa.find({"title":/^b/})#找含有"title"字段,值开头为"b"的
7.其他方法
(1)count()
基本格式:
db.集合.count()
计算集合里的数据量,举例:
> db.aaa.count() 7
(2)sort()
基本格式:
db.集合.find().sort({字段})
将查询的数据结果按某个字段进行排序,值为1
代表升序,-1
代表降序,举例:
> db.aaa.find({}, {"bbb":1}).sort({_id:1})#查询结果按_id进行升序排序
(3)distinct()
将所有集合里含有该字段的值排序表示出来,举例:
> db.aaa.find() { "_id" : "4", "dbc" : "lll" } { "_id" : "3", "bbc" : "lll" } { "_id" : ObjectId("5ba5f2c4ae2521e9094641f2"), "title" : "abc3" } { "_id" : ObjectId("5ba5f2c4ae2521e9094641f3"), "title" : "abc4" } { "_id" : ObjectId("5ba5f3c7ae2521e9094641f9"), "title" : "abc66" }#现在有3个数据有"title"字段> db.aaa.distinct("title") [ "abc3", "abc4", "abc66" ]
(4)limit()
显示结果的条数,举例:
> db.aaa.find({"title":/^a/}).skip().limit(2) { "_id" : ObjectId("5ba5f2c4ae2521e9094641f2"), "title" : "abc3" } { "_id" : ObjectId("5ba5f2c4ae2521e9094641f3"), "title" : "abc4" }#只返回前两个结果
(5)skip()
跳过前几条记录,一般和limit()
配合使用,举例:
> db.aaa.find({"title":/^a/}).skip(5).limit(2) { "_id" : ObjectId("5ba5f2f8ae2521e9094641f7"), "title" : "abc8" } { "_id" : ObjectId("5ba5f2f8ae2521e9094641f8"), "title" : "abc9" }#跳过前五条,所以这里显示的是6、7条
作者:dawsonenjoy
链接:https://www.jianshu.com/p/f27998229900