MongoDB增删改查

插入操作

 Insert
Mongodb 是面向文档存储的数据库,文档结构形式叫 BSON(类似 JSON)。

> db.c1.insert({name:"user1"})
> db.c1.insert({name:"user2"})
> db.c1.insert({name:"user3"})
> db.c1.find()
{ "_id" : ObjectId("5762f567f845d1cdb792d0a1"), "name" : "user1" }
{ "_id" : ObjectId("5762f56af845d1cdb792d0a2"), "name" : "user2" }
{ "_id" : ObjectId("5762f56cf845d1cdb792d0a3"), "name" : "user3" }
> db.c1.insert({name:'user1',post:{title:'test',content:'this is test'}})
> db.c1.insert({name:'user2',post:[1,2,3,4,5]})
> db.c1.find()
{ "_id" : ObjectId("5762f851f845d1cdb792d0a4"), "name" : "user1", 
"post" : { "title" : "test", "content" : "this
is test" } } { "_id" : ObjectId("5762f86cf845d1cdb792d0a5"), "name" : "user2",
"post" :
[ 1, 2, 3, 4, 5 ] }

save

功能类似于insert操作,但是如果插入是2个相同的_id,insert会报错,save不会报错,会进行更新操作。

> db.c1.insert({_id:1,name:"user4"})
> db.c1.insert({_id:1,name:"user4"})
E11000 duplicate key error index: test.c1.$_id_  dup key: { : 1.0 }
> db.c1.save({_id:1,name:"user4"})
> db.c1.save({_id:1,name:"user4"})
> db.c1.find();
{ "_id" : ObjectId("5762f567f845d1cdb792d0a1"), "name" : "user1" }
{ "_id" : ObjectId("5762f56af845d1cdb792d0a2"), "name" : "user2" }
{ "_id" : ObjectId("5762f56cf845d1cdb792d0a3"), "name" : "user3" }
{ "_id" : 1, "name" : "user4" }

删除操作

remove

--删除c1集合中的所有数据
> db.c1.remove()
--有选择条件的删除数据
> db.c1.remove({name:"user3"})

查询操作

find

--查询所有的
> db.c1.find()
{ "_id" : ObjectId("5762f942f845d1cdb792d0a6"), "name" : "user1" }
{ "_id" : ObjectId("5762f945f845d1cdb792d0a7"), "name" : "user2" }
--查询带条件的
> db.c1.find({name:"user1"})
{ "_id" : ObjectId("5762f942f845d1cdb792d0a6"), "name" : "user1" }

选取特定的列

> db.c1.find({name:"user1"},{name:1,_id:0})
{ "name" : "user1" }

条件表达式

1)<,<=,>,>=

> for(i=1;i<=5;i++){
... db.c1.insert({name:"user"+i,age:i});
... }
> db.c1.find()
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
----大于
> db.c1.find({age:{$gt:3}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
--小于
> db.c1.find({age:{$lt:3}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
--大于等于
> db.c1.find({age:{$gte:3}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
--小于等于
> db.c1.find({age:{$lte:3}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
--等于
> db.c1.find({age:5})
--不等于
> db.c1.find({age: {$ne:5}})

2)$all

$all 操作类似$in 操作,但是不同的是, $all 操作要求数组里面的值全部被包含
在返回的记录里面。

> db.c2.insert({name:"user1",post:[1,2,3,4,5]});
> db.c2.find()
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
> db.c2.find({post:{$all:[1,2,3]}})
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
> db.c2.find({post:{$all:[1,2,6]}})
> db.c2.find({post:{$all:[1,2,5]}})
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }

3)$exists

操作检查一个字段是否存在

> db.c2.find({age:{$exists:1}})
> db.c2.find({name:{$exists:1}})
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
> 

4)$mod

操作可以让我们简单的进行取模操作,而不需要用到 where 子句,如:

> db.c1.find({age:{$mod: [2,1]}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }

5)$ne

意思是 not equal,不等于

> db.c1.find({age:{$ne:3}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }

6)$in

$in 操作类似于传统关系数据库中的 IN,看例子:

> db.c1.find({age:{$in:[1,3,5,6]}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }

7)$nin
$nin 跟$in 操作相反,看例子:

> db.c1.find({age:{$nin:[1,3,5]}})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }

8)$or

--或者的关系
> db.c1.find({$or:[{name:"user2"},{name:"user3"}]})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }

9)$nor

$nor 跟 $or 相反

> db.c1.find({$nor:[{name:"user2"},{name:"user3"}]})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }

10)$size

$size 操作将会查询数组长度等于输入参数的数组,例子:

{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
{ "_id" : ObjectId("5764104f16c0d12099a75ecd"), "name" : "user2", "post" : [ 3, 4, 6 ] }
> db.c2.find({post:{$size:3}})
{ "_id" : ObjectId("5764104f16c0d12099a75ecd"), "name" : "user2", "post" : [ 3, 4, 6 ] }
> db.c2.find({post:{$size:5}})
{ "_id" : ObjectId("576300b0f845d1cdb792d0ae"), "name" : "user1", "post" : [ 1, 2, 3, 4, 5 ] }
> db.c2.find({post:{$size:2}})

正则表达式

Mongodb 同样支持正则表达式进行检索

> db.c1.find()
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
> db.c1.find({name:/user2/i})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }

注意: /^a/; /^a.*/; /^a.*$/这三个表达式最后的效果一样,但是后两种查询
效率比第一种要低很多,因为后两种表达式会执行扫描整个字符串,然而第一种
扫描到第一个字符就停止了
选项:
-i: 忽略大小写
-m: 起始符^, 结束符$对于每一个新行都起作用
-x: 忽略空白字符
-s: 这个选项从 1.9 版本后才支持,加上它就可以让“ . ”表示所有字符了,包括
换行符,例如 /a.*b/不匹配"apple\nbanana" ,但是 /a.*b/s 可以

排序

Mongodb 支持排序

> db.c1.find().sort({age:-1})
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
> db.c1.find().sort({age:1}).limit(2)
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0aa"), "name" : "user2", "age" : 2 }

Distinct

类似于关系数据库中的 Distinct

> db.c1.distinct("name")
[ "user1", "user2", "user3", "user4", "user5" ]
> db.c1.distinct("age")
[ 1, 2, 3, 4, 5 ]

分页查询

Mongodb 支持 skip 和 limit 命令来进行分页查询

> db.c1.find().skip(2)
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ad"), "name" : "user5", "age" : 5 }
> db.c1.find().limit(1)
{ "_id" : ObjectId("5762fcccf845d1cdb792d0a9"), "name" : "user1", "age" : 1 }
> db.c1.find().skip(2).limit(2)
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ab"), "name" : "user3", "age" : 3 }
{ "_id" : ObjectId("5762fcccf845d1cdb792d0ac"), "name" : "user4", "age" : 4 }

$elemMatch

> db.c3.find()
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "aaa" }, { "title" : "bbb" }, { "title" : "ccc" } ] }
> db.c3.find({"post.title":33})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] }
-->等同于
> db.c3.find({post:{$elemMatch:{title:22,title:33}}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] }

Cursors 游标及 Cursor Methods

类似传统的关系型数据库, Mongodb 也有游标的概念。可以利用游标对查询结果进行遍历

> var data=db.c1.find()
> data.next()
{
        "_id" : ObjectId("5762fcccf845d1cdb792d0a9"),
        "name" : "user1",
        "age" : 1
}
> data.hasNext()
true

count()

count()方法返回查询记录的总数目

> db.c1.count()
5
> db.c1.find({age:{$lt:3}}).count()
2

NULL查询

{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "name" : "user1" }
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
{ "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 }
--这种查询无法得到想要的结果
> db.c4.find({age:null})
{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "name" : "user1" }
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
> db.c4.find({age:{$type:10}});
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
> db.c4.find({age:{$exists:1,$in:[null]}})
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }

$slice

{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 }, { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "aaa" }, { "title" : "bbb" }, { "title" : "ccc" } ] }
> db.c3.find({name:"user1"},{post:{$slice:2}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 11 }, { "title" : 22 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "aaa" }, { "title" : "bbb" } ] }
> db.c3.find({name:"user1"},{post:{$slice:-1}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "ccc" } ] }
> db.c3.find({name:"user1"},{post:{$slice:[1,2]}})
{ "_id" : ObjectId("5764156d16c0d12099a75ece"), "name" : "user1", "post" : [ { "title" : 22 }, { "title" : 33 } ] }
{ "_id" : ObjectId("5764157d16c0d12099a75ecf"), "name" : "user1", "post" : [ { "title" : "bbb" }, { "title" : "ccc" } ] }

更新操作

update

语法

db.collection.update( criteria, objNew, upsert, multi )

参数说明:

Criteria:用于设置查询条件的对象

Objnew:用于设置更新内容的对象

Upsert:如果记录已经存在,更新它,否则新增一个记录

Multi:如果有多个符合条件的记录,全部更新

注意:默认情况下,只会更新第一个符合条件的记录

{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "name" : "user1" }
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
{ "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 }
--把之前的属性替换了
> db.c4.update({name:"user1"},{sex:"man"})
> db.c4.find()
{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "sex" : "man" }
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
{ "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 }
--如果更新的是不存储的文档,则无变化
> db.c4.update({name:"user6"},{name:"user66"})
--如果加上第三个参数,不存在,则添加
> db.c4.update({name:"user6"},{name:"user66"},1)
--第四个参数为1时,匹配到多个时全部更改(需带$set),默认为0,只更改匹配到的第一个

save()

--如果存在更新它,如果不存在,新增记录
db.mycollection.save(x);

$set
把 field 的值设置成 value, 当 field 不存在时,增加一个字段, 类似 SQL 的 set 操作, value 支持所有类型

{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "sex" : "man" }
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "name" : "user1", "age" : null }
{ "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 30 }
> db.c4.update({name:"user1"},{$set:{age:20}},0,1)
> db.c4.find()
{ "_id" : ObjectId("5764198416c0d12099a75ed0"), "sex" : "man" }
{ "_id" : ObjectId("5764198f16c0d12099a75ed2"), "name" : "user1", "age" : 20 }
{ "_id" : ObjectId("5764198b16c0d12099a75ed1"), "age" : 20, "name" : "user1" }

$inc
把 field 的值加一个 value

{ "_id" : ObjectId("5764271916c0d12099a75edd"), "name" : "user1", "age" : "30" }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "name" : "user2", "age" : "320" }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "name" : "user3", "age" : "20", "score" : 10 }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "name" : "user4", "age" : "15", "score" : 22 }
--所有的文档加10积分,如果不存在属性,则添加
> db.c5.update({},{$inc:{score:10}},0,10)
> db.c5.find()
{ "_id" : ObjectId("5764271916c0d12099a75edd"), "age" : "30", "name" : "user1", "score" : 10 }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "age" : "320", "name" : "user2", "score" : 10 }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "name" : "user3", "age" : "20", "score" : 20 }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "name" : "user4", "age" : "15", "score" : 32 }

$unset
删除给定的字段 field

{ "_id" : ObjectId("5764271916c0d12099a75edd"), "age" : "30", "name" : "user1", "score" : 10 }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "age" : "320", "name" : "user2", "score" : 10 }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "name" : "user3", "age" : "20", "score" : 20 }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "name" : "user4", "age" : "15", "score" : 32 }
--删除score字段
> db.c5.update({},{$unset:{score:1}},0,1)
> db.c5.find()
{ "_id" : ObjectId("5764271916c0d12099a75edd"), "age" : "30", "name" : "user1" }
{ "_id" : ObjectId("5764271d16c0d12099a75ede"), "age" : "320", "name" : "user2" }
{ "_id" : ObjectId("5764272016c0d12099a75edf"), "age" : "20", "name" : "user3" }
{ "_id" : ObjectId("5764272416c0d12099a75ee0"), "age" : "15", "name" : "user4" }

$push
如果 filed 是一个已经存在的数组,那么把 value 追加给 field;
如果 field 原来不存在,那么新增 field 字段,把 value 的值赋给 field;
如果 field 存在,但是不是一个数组,将会出错;

{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "name" : "user1", "arr" : [ 1, 2, 3 ] }
--存在,直接压入到最后
> db.c6.update({name:"user1"},{$push:{arr:4}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "name" : "user1" }
--原来不存在,则新增一个数组
> db.c6.update({name:"user1"},{$push:{arr11:4}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }

$pop
删除数组中最后一个元素

{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pop:{arr:1}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pop:{arr:1}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2 ], "arr11" : [ 4 ], "name" : "user1" }

$pushAll

功能同$push,只是这里的 value 是数组,相当于对数组里的每一个值进行$push操作

{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pushAll:{arr:[3,4,5,6]}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6 ], "arr11" : [ 4 ], "name" : "user1" }

$addToSet

如果 filed 是一个已经存在的数组,并且 value 不在其中,那么把 value 加入到数组;

如果 filed 不存在,那么把 value 当成一个数组形式赋给 field;

如果 field 是一个已经存在的非数组类型,那么将会报错;

{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$addToSet:{arr:7}})
> db.c6.update({name:"user1"},{$addToSet:{arr:7}})
> db.c6.update({name:"user1"},{$addToSet:{arr:7}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
--同时压入多个值
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$addToSet:{arr:{$each:[7,8,9]}}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "arr11" : [ 4 ], "name" : "user1" }

$pull
如果 field 是一个数组,那么删除符合_value 检索条件的记录;
如果 field 是一个已经存在的非数组,那么会报错;

--根据值来进行删除数组的元素
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pull:{arr:9}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pull:{arr:8}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }

$pullAll
同$push 类似,只是 value 的数据类型是一个数组

{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4, 5, 6, 7 ], "arr11" : [ 4 ], "name" : "user1" }
> db.c6.update({name:"user1"},{$pullAll:{arr:[5,6,7]}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }

$rename
重命名指定的字段名称

{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr" : [ 1, 2, 3, 4 ], "arr11" : [ 4 ], "name" : "user1" }
--将字段名arr改为post
> db.c6.update({name:"user1"},{$rename:{arr:"post"}})
> db.c6.find()
{ "_id" : ObjectId("576428dc16c0d12099a75ee1"), "arr11" : [ 4 ], "name" : "user1", "post" : [ 1, 2, 3, 4 ] }

特殊操作符: $

$操作符代表查询记录中第一个匹配条件的记录项。

{ "_id" : ObjectId("576431bc16c0d12099a75ee2"), "arr" : [ { "title" : "linux" }, { "title" : "php" }, { "title" : "java" } ], "name" : "user1" }
> db.c7.update({"arr.title":"linux"},{$set:{"arr.$.content":"linux is very much"}})
> db.c7.find()
{ "_id" : ObjectId("576431bc16c0d12099a75ee2"), "arr" : [ {  "content" : "linux is very much",  
"title" : "linux" }, { "title" : "php" }, { "title" : "java" }
], "name" : "user1" }

 

posted on 2016-06-21 19:42  gimin  阅读(202)  评论(0)    收藏  举报