一日三省吾身

博客园 首页 联系 订阅 管理

1、可以使用insert方法向目标集合插入一个文档,db.foo.insert({"key":"value"})。save方法也可以插入文档,它只有一个参数:文档,如果该文档不存在,会自动创建文档;如果文档存在,它就更新这个文档。要是这个文档含有“_id”键,save会调用upsert。否则,会调用insert。

2、 批量插入:可以使用batchInsert函数实现批量插入,它接受的是一个文档数组作为参数。如果要向集合中插入多个文档,使用批量插入会快一些,可以将一组文档传递给数据库。例如:

          db.foo.batchInsert([{"_id":0},{"_id":1},{"_id":2}]);只有需要将多个文档插入到一个集合时,这种方式才会有用。不能在单次请求中将多个文档插入到多个集合。在一次批量插入中,能插入的文档是有限制的,目前mongodb能接受的最大消息长度是48MB,如果试图插入48MB以上的数据,多数驱动程序会将这个批量插入请求拆分成多个48MB的批量插入请求。如果在执行批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入到集合中,而在这个文档以及以后的所有文档都将插入失败。(在最新版的api中该方法已经废弃,可以使用bulkWrite和insertOne实现)

3、删除文档:可以使用remove()和drop()方法。remove会删除集合中的所有文档,但是不会删除集合本身,也不会删除集合的元信息。remove可以接受一个查询文档作为可选参数,给定这个参数以后,只有符合条件的文档才会别删除,删除数据是永久性的,不能撤销,也不能恢复。比如:db.foo.remover({}),删除集合的所有文档。db.foo.remove({"title":"ttt"})只删除title是ttt的文档。使用drop删除时咬注意,drop不能有任何限定条件,整个集合都会被删除,元数据也会被删除。但是drop的删除速度比remove要快很多。

4、更新文档:update方法更新,更新操作是不可分割的,若两个更新同时发生,先到达服务器的先执行,接着执行另外一个,所以,两个需要同时进行的更新会迅速接连完成,此过程不会破坏文档,最新的更新取得“胜利”。update({查询器},{修改器})。修改器:$set,用来指定一个字段值,如果这个字段不存在,则创建它,存在则修改。这对更新模式或者增加用户定义的键来说非常方便。例如:db.users.update({"name":"joe"},{$set:{"favorite book":"mongodb"}})用$set甚至可以修改键的类型,db.users.update({"name":"joe"},{$set:{"favorite book":["mongodb","Spring"]}}),可以$unset将一个不需要的键完全删除,db.users.update({"name":"joe"},{$unset:{"favorite book":1}})。$inc用来增加已有键的值,或者该键不存在则创建,只能用于整型、长整型和双精度浮点型的值,要是用在其他类型的数据会导致操作失败。$inc的键的值必须是数字。$push会向已有的数组末尾加入一个元素,要是没有就创建一个新的数组。$setOnInsert有时需要在创建文档的同时创建字段并为它赋值,但是在之后的更新操作中,这个字段的值都不会改变,$setOnInsert只会在文档插入时设置字段的值。例如:db.users.update({},{$setOnInsert:{"createAt":new Date()}},true),如果第二次运行这个更新,会匹配到这个已存在的文档,所以不会再插入文档,因此,createAt的值也不会改变。多文档更新,可以将update第四个参数设置为true,多文档更新对迁移模式非常有用,还可以对特定用户发布新功能使用,例如:db.user.update({"birthday":"10/13/1990"},{$set:{"gift":"happy dirthday"}},false,true)这样就给生日为1990.10.13的所有用户添加了gift键。如果想要知道多文档更新到底更新了多少个文档,可以运行getLastError命令(可以理解为“返回最后一次操作的相关信息”)(命令:db.runCommand({getLastError:1}))。findAndModify命令可以得到被更新的文档,findAndModify能够在一个操作中返回匹配结果并且进行更新,一个键可以有任意多个条件,但是一个键不能对应多个更新修改器,例如,修改器不能同时含有{$inc:{age:1},$set:{age:40}},因为修改了age两次,但是对于查询条件就没有这样的限制。

5、查询文档:可以使用find()和findOne()方法,后者只返回符合条件的第一条记录。查询就是返回一个集合中文档的子集,子集的范围从0个文档到整个集合。find()的第一个参数决定了要返回那些文档,这个参数是一个文档,用于指定查询条件。空的查询文档(例如{})会匹配集合的全部内容,默认为{},可以向查询文档中加入多个键/值对,将多个查询条件组合在一起。例如:db.user.find({"username":"ttt","age":20})。有时并不想要把文档中的键/值都返回,可以通过find(或者findOne)的第二个参数来指定想要的键。例如只对用户集合的"username"和"email"键感兴趣,可以使用如下查询返回:db.users.find({"_id":ObjectId("xxx")},{"username":1,"email":1});同时也可以用第二个参数剔除查询结果中的某些键/值对,例如:db.users.find({},{"_id":0})。

  1>、查询条件,$lt,$lte,$gt,$gte,$ne,$ne能用于所有类型的数据;

  2>、OR查询,mongodb中有两种方式进行OR查询:$or可以在多个键中查询任意给定的值;$in可以用来查询一个键的多个值,$in非常灵活,可以指定不同类型的条件和值,例如:db.users.find({"user_id":{$in:[123,"joe"]}});要是$in对应的数组只有一个值,那么和直接匹配这个值效果一样,例如:db.users.find({"user_id":{$in:[123]}})和{"user_id":123}。与$in相对应的是$nin,$nin将返回与数组中所有条件都不匹配的文档。$or接受一个包含所有可能条件的数组作为参数,$or可以包含其他条件,$or在任何情况下都会工作。例如:                                                   db. users.find({$or:[{"user_id":{$in:[123,456]}},{"name":"ttt"}]})。使用普通的AND查询时,总是希望尽可能用最少的条件来限定结果的范围,OR则相反:第一个条件应该尽可能更多的匹配文档。

  3>、$not:元条件句,既可以用在任何其他条件上,$not与正则表达式联合使用更为有用。$mod:取模运算符,$mod会将查询的值除以第一个给定的值,若余数等于第二个给定的值则匹配成功。例如:db.users.find({"id_num":{$not:{$mod:[5,1]}}}),将返回id_num值除以5余数不为1的所有文档。

  4>、特定类型的查询:null,null类型的行为有点奇怪,它不仅会匹配某个键的值为null的文档,而且还会匹配不包含这个键的文档;如果仅想匹配键值为null的文档,既要检查该键的值是否为null,还要通过$exists条件判定键值已存在,例如:db.c.find({"z":{$in:[null],$exists:true}})。正则表达式,它能灵活有效的匹配字符串,系统可以接受正则表达式标识(i),但是不一定要有。查询数组:查询数组元素与查询标量值是一样的;如果需要通过多个元素匹配数组,就需要用$all,这样会匹配一组元素,$all数组里面的元素的顺序无关紧要。例如:db.food.insert({"_id":1,"fruit":["apple","banana","peach"]}),db.food.insert({"_id":2,"fruit":["apple","orange"]}),db.food.insert({"_id":3,"fruit":["cherry","banana","apple"]}),使用命令查询db.food.find({fruit:{$all:["apple","banana"]}}),会查到_id值为1和3的文档,要是对只有一个元素的数组使用$all和不用一样。也可以使用数组进行精确匹配,但是,精确匹配对于缺少元素或者元素冗余的情况就不太好使,精确匹配对元素的顺序有限定。例如:db.food.find({fruit:["apple","banana","peach"]})会匹配到第一个,db.food.find({fruit:["apple","banana"]})和db.food.find({fruit:["peach","apple","banana"]})都不会匹配到。要是想查询数组特定位置的元素,可以使用key.index语法指定下标,数组下标从0开始,例如:db.food.find({"fruit.2":"peach"}),该表达式会用数组的第三个元素和"peach"进行匹配。$size:可以用来查询特定长度的数组,但是并不能与其他条件组合使用。$slice:该操作符可以返回某个键匹配的数组元素的一个子集。例如,假设有一个博客文章的文档,希望返回前10条评论,可以这样做:db.blog.posts.findOne({criteria,{comments:{$slice:10}}}),把10改成-10,表示返回后10条评论$slice也可以指定偏移量以及希望返回的元素数量,来返回元素集合中间位置的某些结果。例如:db.blog.posts.findOne({criteria,{comments:{$slice:[23,10]}}}),这个操作会跳过前23个元素,返回第24~33个元素,如果数组不够33个元素,则返回第23个元素后面的所有元素。除非特别声明,否则使用$slice时将返回文档中的所有键,别的键说明符都是默认不返回未提及的键,这与$slice不太一样。$操作符:$操作符可以得到一个匹配的元素

 

posted on 2016-12-21 09:46  一日三省吾身  阅读(195)  评论(0编辑  收藏  举报