Mongodb 内嵌数组操作

转载 2015年11月19日 13:17:29

转载地址:http://blog.51yip.com/nosql/1639.html

mongodb update 数组 操作


前一篇文章说到了mongodb update 的字符操作,下面说一下mongodb update的数组操作,用的版本是mongodb2.6.3。

一,$美元符号,在update中,可理解为数组下标

例1

  1. db.students.insert(       //插入测试数据  
  2.  [  
  3.  {"_id" :6, "grades" : [ 80, 85, 90 ],"score":[10,40,54]},  
  4.  {"_id" :7, "grades" : [ 88, 90, 92 ],"score":[100,30,51]}  
  5.  ]  
  6. );  
  7.   
  8. //把满足score大于90的grades,数组的第一个元素设置成88  
  9. db.students.update(  { score: {$gt:90} },  
  10.             { $set: { "grades.$" : 88 } } ,  
  11.             { multi:true }  
  12.              );  

相同功能php代码:

  1. $where = array("score"=>array('$gt'=>70));  
  2. $param = array('$set'=>array('grades.$'=>"303"));  
  3. $ismore = array("multiple" => true);  
  4. $collection->update($where,$param,$ismore);  

例2

  1. db.test2.insert(  
  2.  {  
  3.  "content" : "this is a blog post.",  
  4.  "comments" :  
  5.  [  
  6.  {  
  7.  "author" : "Mike",  
  8.  "comment" : "I think that blah blah blah...",  
  9.  },  
  10.  {  
  11.  "author" : "John",  
  12.  "comment" : "I disagree."  
  13.  }  
  14.  ]  
  15.  }  
  16. );  
  17.   
  18. //查找名为Mike的记录,并且该人的名字改成tank  
  19. db.test2.update( { "comments.author""Mike"},  
  20.  { $set: { "comments.$.author" : "tank" } }  
  21.  );  

相同功能php代码:

  1. $where = array("comments.author"=>"John");  
  2. $param = array('$set'=>array('comments.$.author'=>"tank"));  
  3. $ismore = array("multiple" => true);  
  4. $collection->update($where,$param,$ismore);  

二,$addToSet 如果数组中没有该数据,向数组中添加数据,如果该数组中有相同数组,不添加

  1. db.test3.insert(  
  2.  {"_id" :6, "grades" : [ "aaa""bbb""ccc" ]}  
  3.  );  
  4.   
  5. db.test3.update( { _id: 6 }, { $addToSet: { grades: "ddd"  } });  

相同功能php代码:

  1. $where = array("_id"=>6);  
  2. $param = array('$addToSet'=>array('grades'=>"eee"));  
  3. $collection->update($where,$param);  

三,$pop删除数组数据

  1. db.test3.update( { _id: 6 }, { $pop: { grades: -1 } }); //从头删除   
  2.   
  3. db.test3.update( { _id: 6 }, { $pop: { grades: 1 } }); //从尾删除  

相同功能php代码:

  1. $where = array("_id"=>6);  
  2. $param = array('$pop'=>array('grades'=>-1));  
  3. $collection->update($where,$param);  

四,$pull和$pullAll删除指定数据

1,$pull

  1. > db.test3.find();  
  2. "_id" : 6, "grades" : [ "ccc""ddd" ] }  
  3. "_id" : 7, "grades" : [ "aaa""bbb""ccc" ] }  
  4. "_id" : 8, "grades" : [ "aaa""bbb""ccc""ddd""eee" ] }  
  5.   
  6. > db.test3.update(  
  7.  { grades: "aaa" },  
  8.  { $pull: { grades: "aaa" } }, //支持这种查找或匹配 $pull: { votes: { $gte: 6 } }  
  9.  { multi: true }  
  10.  );  
  11. WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })  

相同功能php代码:

  1. $where = array("grades"=>"bbb");  
  2. $param = array('$pull'=>array('grades'=>"bbb"));  
  3. $ismore = array("multiple" => true);  
  4. $collection->update($where,$param,$ismore);  

2,$pullAll

  1. db.students.update( { _id: {$gt:1} },  
  2.  { $pullAll: { "grades": [90,92] } } //只支持数组  
  3.  );  

相同功能php代码:

  1. $where = array("grades"=>"ddd");  
  2. $param = array('$pullAll'=>array('grades'=>array("ddd","eee")));  
  3. $ismore = array("multiple" => true);  
  4. $collection->update($where,$param,$ismore);  

五,$push,$each,$sort,$slice,$position

1,各元素解释

$push 向数组中添加元素

$each 循环数据

$sort 对数组进行排序

$slice 对整个collection表进行数据裁减,用的时候一定要当心

$position 插入数据的位置。

2,实例

  1. db.test4.insert(  
  2. {  
  3.  "_id" : 5,  
  4.  "quizzes" : [  
  5.  { wk: 1, "score" : 10 },  
  6.  { wk: 2, "score" : 8 },  
  7.  { wk: 3, "score" : 5 },  
  8.  { wk: 4, "score" : 6 }  
  9.  ]  
  10. }  
  11. );  
  12.   
  13. db.test4.update( { _id: 5 },  
  14.  { $push: { quizzes: { $each: [ { wk: 5, score: 8 },  
  15.                                 { wk: 6, score: 7 },  
  16.                                 { wk: 7, score: 6 } ],  
  17.                        $sort: { score: -1 },  
  18.                        $slice: 3,  
  19.                        $position:2  
  20.                       }  
  21.            }  
  22.  }  
  23.  );  

相同功能php代码:

  1. $where = array("_id"=>5);  
  2. $param = array('$push'=>array('quizzes'=>array('$each'=>array(array("wk"=>9,"score"=>10),array("wk"=>20,"score"=>11)),  
  3.                                                '$sort'=>array("score"=>-1),  
  4.                                                '$position'=>2,  
  5.                                                '$slice'=>3        //用$slice一定要小心,在这里会把整表数据裁减成3条  
  6.                                               )  
  7.                                    )  
  8.                        );  
  9. $collection->update($where,$param);
     

MongoDB 数组修改更新方法,很不错拿出来分享一下

MongoDB数组修改器更新数据这里,我们将了解一下数组修改器。数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用。数组修改器,顾名思义,它是用来修改数...
  • zilu_wang
  • zilu_wang
  • 2016年05月19日 21:39
  • 4162

学习MongoDB--(4-2):MongoDB查询(数组、内嵌文档和$where)

上篇主要介绍了一些基本的查询条件操作符的使用,主要针对的是一些单值,我们这次来讲讲如何查询文档内的数组和嵌入文档,并讲一下复杂查询"$where"。 【查询数组】 查询数组很容易,对于数组,我们可...
  • DrifterJ
  • DrifterJ
  • 2012年08月08日 22:21
  • 70096

MongoDB 数组查询

MongoDB在文档上支持数组,其次数组上可以实现嵌套,以及数组元素也可以文档。因此,对于文档上数组的操作,MongoDB提供很多种不同的方式,包括数组的查询,数组元素的添加删除等等。本文主要描述数组...
  • robinson_0612
  • robinson_0612
  • 2017年02月13日 16:08
  • 5428

MongoDB学习四--MongoDB插入数据详情

1,插入文档 In MongoDB, the db.collection.insert() method adds new documents into a collection. ...
  • done58
  • done58
  • 2015年08月20日 23:55
  • 3563

mongo对内嵌数组的操作

由于mongo的弱关联关系,导致mongo的内嵌数组会被频繁使用,以达到一定的"关联关系"。所以对mongo的数组的操作也是非常重要的。接下来简单的介绍一下mongo对数组的操作,至于用java进行这...
  • qq_20127333
  • qq_20127333
  • 2016年05月26日 17:05
  • 5709

Mongodb嵌套文档的修改-利用数组修改器更新数据

初学mongodb的可能和我一样有个疑问,mongodb是文档型的,那么如果一个文档嵌套另外一个文档,如果对这个嵌套文档进行增删改查呢。 就像如下这样:,如何对auther里面的name进行增删改查...
  • zahuopuboss
  • zahuopuboss
  • 2016年11月07日 01:46
  • 1506

mongodb 不重复添加数组方法

同学们在使用MONGODB时,会不会有这样的需求。比如自己喜欢的书保存在数据库中可能是一个数组行式。 1 2 3 4 {   user:'boy',   books:[...
  • spotatoes
  • spotatoes
  • 2016年06月12日 19:35
  • 2501

mongodb 内嵌数组关于排序的问题

{"_id" : ObjectId(“54115f9db4daf5a789d799fa”),“arrays” : [{“name” : “a1”,“size” : 1},{“name” : “a2”,...
  • yisun123456
  • yisun123456
  • 2017年11月17日 16:49
  • 137

mongodb常用的两种group方法,以及对结果排序

mongodb作为no-sql数据库的典型代表,拥有着存储海量数据的性能,在插入数据和查询数据方便也有着相对于其他关系型数据库明显的优势,最近学习了mongodb,发现mongodb中没有mysql中...
  • qq_27717921
  • qq_27717921
  • 2016年05月05日 10:44
  • 9665

MongoDB 针对嵌套对象,多层级结构存储,增删改查

简要介绍NOSQLmongoDB 是属于NOSQL.什么是nosql,NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。 NoSQL,指的是非关系型的数据库。NoSQ...
  • walle167
  • walle167
  • 2016年04月29日 13:43
  • 10789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mongodb 内嵌数组操作
举报原因:
原因补充:

(最多只允许输入30个字)