}
>
> var user = {"name":"Tom","emailaddrs":["a@b.com","b@b.com"]};
> db.users.insert(user);
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "name" : "Tom", "emailaddrs" : [ "a@b.com", "b@b.com" ] }
> 现在我们需要再加一个邮件地址:c@b.com,我们可以使用这个修改器添加新的邮件地址:
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$addToSet":{"emailaddrs":"c@b.com"}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "a@b.com", "b@b.com", "c@b.com" ], "name" : "Tom" }
>
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$addToSet":{"emailaddrs":"c@b.com"}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "a@b.com", "b@b.com", "c@b.com" ], "name" : "Tom" }
> 再次执行上面的操作是不会重复添加邮件地址的。
$each修改器(配合$addToSet修改器使用)
$addToSet配合$each修改器可以实现一次批量修改。接着上面邮件列表的例子,如果一次需要添加几个邮件地址,使用$ne和$push就不能一次直接添加多个地址。操作如下:
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$addToSet":{"emailaddrs":{"$each":["d@b.com","e@b.com"]}}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "a@b.com", "b@b.com", "c@b.com", "d@b.com", "e@b.com" ], "name" : "Tom" }
>
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$addToSet":{"emailaddrs":{"$each":["d@b.com","e@b.com"]}}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "a@b.com", "b@b.com", "c@b.com", "d@b.com", "e@b.com" ], "name" : "Tom" }
> $pop修改器
这个修改器可以将数组任何一端的第一个值删除。{"pop":{key:1}}将数组尾部值删掉,{"pop":{key:-1}}:将数组头部值删除。演示一下:
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pop":{"emailaddrs":1}});
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pop":{"emailaddrs":-1}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "b@b.com", "c@b.com", "d@b.com" ], "name" : "Tom" }
>
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pop":{"emailaddrs":1}});
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pop":{"emailaddrs":-1}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "b@b.com", "c@b.com", "d@b.com" ], "name" : "Tom" }
> 这样,第一个和最后一个邮件地址都被删除了。
$pull修改器
这个修改器也是用来删除数组中的元素的,但是是通过条件匹配来删除所有条件满足的值,而不仅仅是删某一个。接上面的例子,我们可以用它删除c@b.com
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pull":{"emailaddrs":"c@b.com"}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "b@b.com", "d@b.com" ], "name" : "Tom" }
>
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$pull":{"emailaddrs":"c@b.com"}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "b@b.com", "d@b.com" ], "name" : "Tom" }
> 数组定位修改器
数组定位可以通过两种方式实现:下标和$(定位操作符)。下标是从0开始的。
数组定位方式修改第一个邮件地址:
> db.users.update({"_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62")},{"$set":{"emailaddrs.0":"bbb@b.com"}});
> db.users.find();
{ "_id" : ObjectId("4ee49adeaf9c9fecc9c9cf62"), "emailaddrs" : [ "bbb@b.com", "d@b.com" ], "name" : "T |