var p1 = { "name":"Jack", "age":34, "nickname":"xiaoqiang", friends:[ {"name":"Cloe","age":"28"}, {"name":"Audrey","age":"31"}, ] } var p2 = { "name":"Cloe", "age":28, friends:[ {"name":"Jack","age":"34"}, {"name":"Mike","age":"31"}, ] } var p3 = { "name":"Audrey", "age":31, friends:[ {"name":"Jack","age":"34"}, {"name":"Hammer","age":"61","relation":"parent"}, ] }
1. 插入时MongoDB会检查文档是否包含_id,如果文档没有指定_id,MongoDB会为其创建;
2. 如果要插入的文档是多个,推荐使用批量插入。这样,可以减少连接MongoDB服务器的次数
3. MongoDB在插入文档时MongoDB仅检查传入数据是否包含_id以及数据大小是否超过16MB(v1.8-为4M),除此之外不再做任何验证,相对于SQL数据库的完整性校验操作,性能提高很多
依次插入:
use foobar db.people.insert(p1); db.people.insert(p2) db.people.insert(p3); db.people.find() //查询所有数据 db.people.findOne(); //返回第一条数据,即find()操作的第一条数据
批量插入:
use foobar db.people.remove(); var p = [p1, p2, p3]; db.people.insert(p); //MongoDB会将数组解释为文档集合,而不是插入集合本身 db.people.find();
1.所谓的文档更新,实际效果是替换操作
2.默认情况下update只会更新第一个匹配到的文档,开启multi模式,才会更新所有匹配到的文档。在新版本的MongoDB中,multi update only works with $ operators
use foobar db.people.update({"name":"Jack"},{"age":40});//不出意外的发现,name为Jack的文档完全被替换了成{"age":40}而不是期望的把Jack的age属性改为40 db.people.update({"age":40},p1); //还原为原来的文档 p1.age = 40; db.people.update({"name":"Jack"},p1);//能够实现把name为Jack的文档的age改为40,其它保持不变,本质上还是替换操作,替换的是文档的内容,但是文档的主键保持不变
如果要删除的文档中包含的文档非常多,使用db.people.drop()删除people这个文档,还要执行db.people.ensureIndex()
db.people.remove({"age":40}); //删除age为40的文档,首先做了一个查找age为40的查询 db.people.remove({ "_id" : ObjectId("54431f77f663556fc09af351")});//把主键作为删除的查询条件 db.people.remove();//不带任何参数,清空people集合中的所有文档
1. 使用update操作,如果文档不存在,update结果无影响
2. 使用upsert操作(update方法的第三个参数为true),那么如果找不到要更新的文档,则做insert操作
use foobar p1.age = 40; db.people.update({"name":"JackNOtExit"},p1);//操作无影响 db.people.find(); db.people.update({"name":"JackNOtExit"},p1,true);//添加true作为第三个参数,操作的结果是新增一个新的文档
1. MongoDB把inc作为变量使用,因此不能使用引号把$inc括起来
2. MongodDB的$inc操作,是getAndInc操作,因此,它不会与其它的$inc操作产生冲突
db.people.update({"name":"Jack"},{$inc:{"age":3}}); //为Jack的age属性加3,此时的update操作即针对键进行更新操作,而不是普通Update操作那样是个替换操作
db.people.update({"name":"Jack"},{$set:{"age":34,"worklocation":"ctu"}});//Jack的age改为34,同时添加了一个新的键worklocation //$set作用于数组,相当于替换。使用$push/$pop操作数组元素 db.people.update({"name":"Jack"},{$set:{"friends":[{"Tony":"33"}]}}); //$set为Jack添加一个对象obj db.people.update({"name":"Jack"}, {$set:{"obj":{"value":1}}}); db.people.update({"name":"Jack"}, {$set:{"obj.value":2}}); //将Jack的obj对象的value值改为2,使用Javascript的点语法
db.people.update({"name":"Jack"}, {$set:{"friends.1.age":35}}); //把Jack的friends数组的第二个元素(下标为1)的age改为35 db.people.update({"name":"Jack"}, {$set:{"friends.1.age":35}}); //把Jack的friends数组的第二个元素(下标为1)的age改为35 //把朋友中包含名字为Andrey的元素对应的age改为77,$在这里充当选出来的元素在数组中的下标 //friends.name的含义不是friends有个name键,而是指的是friends数组中的每个元素的name属性 db.people.update({"friends.name":"Audrey"}, {$set:{"friends.$.age":77}});
db.people.update({"name":"Jack"},{$unset:{"worklocation":"ctu"}});//把刚给Jack新加的键worklocation删除
var item = {"name":"Tony","age":"33"}; db.people.update({"name":"Jack"},{$push:{"friends": item}}); //为Jack的friends添加一个元素item,item作为内嵌的文档,没有_id属性 var items = {item, item}; db.people.update({"name":"Jack"},{$push:{"friends": items}}); //为Jack的friends添加一个元素items,items作为friends的一个数组类型的元素
var items = {item, item}; db.people.update({"name":"Jack"},{$pushAll:{"friends": items}}); //为Jack的friends添加两个元素,分别是items数组中的元素
var items = {item, item}; db.people.update({"name":"Jack"},{$set:{"friends":[]}});//清空Jack的friends数组 db.people.update({"name":"Jack"},{$addToSet:{"friends": items}}); //通过addToSet为Jack的friends添加元素,奇怪的是没达到去重效果,即friends中包含两个一样的item
应该使用$each操作符
var items = {item, item}; db.people.update({"name":"Jack"},{$set:{"friends":[]}});//清空Jack的friends数组 db.people.update({"name":"Jack"}, {$addToSet:{"friends":{$each:items}}});
db.people.update({"name":"Jack"},{$pop:{"friends":-1}}); //friends指定了要删除元素的键;-1表示删除数组的头元素
db.people.update({"name":"Jack"},{$pull:{"friends":{"name":"Cloe"}}});; //从Jack的friends数组删除满足条件的元素,name是friends元素的一个属性,而不是friends本身的属性
更新操作包含了查询的语义,update操作的第一个参数就是指定查询条件,在这篇文章中,都是使用{"name":"Jack"}作为查询条件,实际上的查询条件要比这个复杂的多,下一篇博客将详细介绍MongoDB的查询,它类似于$修改器,MongoDB提供了很多用于设置查询条件的$比较器,$逻辑器等。