大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

Mongodb 数据操作

1.查询

(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条