`
bit1129
  • 浏览: 1052106 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【MongoDB学习笔记六】MongoDB修改器

 
阅读更多
本文首先介绍下MongoDB的基本的增删改查操作,然后,详细介绍MongoDB提供的修改器,以完成各种各样的文档更新操作

 MongoDB的主要操作

  • show dbs 显示当前用户能看到哪些数据库
  • use foobar 将数据库切换到foobar
  • show collections 显示当前数据库有哪些集合
  • db.people.update,update不带参数,可以用于察看源代码
  • help可以查找帮助
  • db.help()
  • db.people.help();

测试数据:

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"},
]
}

 

MongoDB基本的增删改查操作

 

创建文档

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作为第三个参数,操作的结果是新增一个新的文档

 

  MongoDB修改器

  • $inc 对指定的键做加法操作,如果指定的关键不存在,则新创建这个键,并且赋值为$inc指定的值。
  • $set 为指定的键赋值,如果指定的键不存在,则自动创建。设值的情况比较复杂,比如为内嵌文档的某个Key设值,复杂点在于需要指定MongoDB能够解析到指定Key的表达式
  • $unset $set的反操作,即它用来清除一个Key及其值
  • $push 对数组进行操作(在MongoDB中,只有Javascript数组一种集合类型,其它语言如Java的各种集合类型都会保存为Javascript的数组),$push将一个元素追加到集合的末尾(不管这个元素是否存在于数组中),如果数组不存在,则首先创建数组
  • $pushAll $push操作的批量版本,如果给$push操作提供一个数组作为参数,那么$push认为是把整个数组作为一个元素加入到指定的数组末尾
  • $addToSet $pushAll的去重版本,即$addToSet实现了Java的Set集合的特性(Set中不能包含相同的元素)
  • $pop 从数组中移除一个元素{$pop:{"key":1}}从数组末尾删除;pop:{"key":-1}}从数组开头删除;
  • $pull 从数组中移除指定的元素
  • $pullAll $pull的批量版本
  • $rename 修改指定键的键名

$inc

 1. MongoDB把inc作为变量使用,因此不能使用引号把$inc括起来

 2. MongodDB的$inc操作,是getAndInc操作,因此,它不会与其它的$inc操作产生冲突

 

 db.people.update({"name":"Jack"},{$inc:{"age":3}}); //为Jack的age属性加3,此时的update操作即针对键进行更新操作,而不是普通Update操作那样是个替换操作
 

 

$set

 

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的点语法 

 

$set定位修改$符

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}}); 


 

 

$unset

 

db.people.update({"name":"Jack"},{$unset:{"worklocation":"ctu"}});//把刚给Jack新加的键worklocation删除

 

 $push

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的一个数组类型的元素

  

 

$pushAll

 

var items = {item, item};
db.people.update({"name":"Jack"},{$pushAll:{"friends": items}}); //为Jack的friends添加两个元素,分别是items数组中的元素

 

 

$addToSet

 

 

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}}});
 

 

 

$pop

 

db.people.update({"name":"Jack"},{$pop:{"friends":-1}}); //friends指定了要删除元素的键;-1表示删除数组的头元素
  

 

$pull

 

db.people.update({"name":"Jack"},{$pull:{"friends":{"name":"Cloe"}}});; //从Jack的friends数组删除满足条件的元素,name是friends元素的一个属性,而不是friends本身的属性

 

MongoDB查询

更新操作包含了查询的语义,update操作的第一个参数就是指定查询条件,在这篇文章中,都是使用{"name":"Jack"}作为查询条件,实际上的查询条件要比这个复杂的多,下一篇博客将详细介绍MongoDB的查询,它类似于$修改器,MongoDB提供了很多用于设置查询条件的$比较器,$逻辑器等。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics