如果每次我们都讲某个对象获取出来,再进行修改再进行update操作,这样效率很低,而且需要步骤太多了。mongodb提供了一种高效的修改方法:

//set

> db.users.insert({"name": "may", "age": 22}); //插入一个用户

> db.users.find();



{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "name" : "may", "age" : 20 }

//显示某个用户

如果我们给这个文档重新设定一个新的属性呢。可使用$set

> db.users.update({"_id": ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$set": {"sex": "male"}});

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "age" : 20, "name" : "may", "sex" : "male" }

我们发现给它新增加了一个sex属性。

同样,我们可以使用$set再进行修改

> db.users.update({"_id": ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$set": {"sex": "female"}});

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "age" : 20, "name" : "may", "sex" : "female" }

//$set 通常对某个文档增加一个新的属性或者修改这个文档中已有的属性

同样,可以增加就可以删除。这个属性为unset

> db.users.update({"_id": ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$unset": {"sex": 1}});

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "age" : 20, "name" : "may" }

我们尝试多_id进行删除

> db.users.update({"_id": ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$unset": {"_id": 1}});

Mod on _id not allowed

页面提示如上,说明这个_id是不可被删除的。重新find一下。查看结果。

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "age" : 20, "name" : "may" }

没有被删除

如果某个属性的值类型为数字,我们还可进行数值增加、删除等操作。这个使用使用$inc

> db.users.update({ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$inc": {"age": 10}});

给_id为 ObjectId("4fd0ab65bd1049ad60f809bc")的文档的age属性增加10

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "age" : 30, "name" : "may" }

我们尝试对某个不存在的属性进行数值增加

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$inc": {"no": 1000}});

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "age" : 30, "name" : "may", "no" : 1000 }

系统会增加这个不存在的属性,并进行数值设定

我们删除这个对象的多余的属性

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$unset": {"no": 1, "age": 1}});

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "name" : "may" }

push用于对某个数组属性增加新的值

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$push": {"comments": {"author": "may"}}});

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "comments" : [ { "author" : "may" } ], "name" : "may" }

//我们发comments为一个数组,数组内包含元素

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$push": {"comments": {"title": "just a joke!"}}});

需要注意的是。push不能对系统中已有的不为array的数组进行数据增加:

> db.users.update({"_id": ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$push": {"name": {"name": "may", "age": 20}}})

按照字面意思,理解为对某个文档的name进行push两个对象进去,但是由于该属性name不为数组,所以系统提示出错

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$unset": {"comments": 1}});

对于push,我们可以在push的时候进行已有数值判定,如果push进入的数组内已有某个数值,那么我们就不再进行push,通常做法是获取出所有数值,在进行比对,但是mongodb提供了一个push时候的方法。可自行进行判断。

$addToSet //添加到设置

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$push": {"friend": {"name": "kai"}}});

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$addToSet": {"friend": {"name": "kai"}}}); //如果我们用push,会有两个friend,但是这个不符合实际要求,使用addToSet,查看结果

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "friend" : [ { "name" : "kai" } ], "name" : "may" }

我们尝试使用push再进行测试

> db.users.update({"_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$push": {"friend": {"name": "kai"}}});

> db.users.find();

{ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc"), "friend" : [ { "name" : "kai" }, { "name" : "kai" } ], "name" : "may" }

他有了两个相同的friend。addToSet就是有push的时候增减是否重复值判断的作用。

现在的做法是,我们插入friend的是对象,有些时候,我们只需要插入某个人的名称(string)即可。使用如下方法:

> db.users.update({ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$push": {"friend": "haiyan"}});

批量插入,我们可以使用each //each是通常使用在数组上的一个方法。这个地方用法类型

> db.users.update({ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$addToSet": {"friend": {"$each": ["wang1", "wang2", "wang3"]}}});

需要注意的是,如果使用push,不会进行each,相反,会插入一个key为$each,value为数组的对象进去

同样,我们还可以删除数组中的某个键值

使用和push相反的push

> db.users.update({ "_id" : ObjectId("4fd0ab65bd1049ad60f809bc")}, {"$pop": {"friend": "wang1"}});

删除某个文档中friend的某个key为wang1的值,或者没key,只有value的wang1的值;

常用插入、修改、删除方法已如上