Mongodb子文件

时间:2014-08-05 11:38:32

标签: mongodb select subdocument

mongodb的新版本中有没有办法:

  1. 选择子文档 或文档内数组中的对象,而不是检索父文档,
  2. 然后运行并再次在内存中搜索一个项目/子文档。
  3. 让我们说一个用户文档里面有一个列表,其中一个项目的价格超过50美元。
    我只想要这个项目而不是检索用户文档,然后再次搜索某个项目。

    我读过它可能会在下一个版本中找到,但无法找到它。 谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用$ elemMatch。见http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

所以,在你的情况下,它将类似于下面的内容:

  

db.users.insert({" items":[{" name":" A1"," price":10} ,{"名称":" B1","价格":20}]})
  db.users.insert({" items":[{" name":" A2"," price":40},{& #34;姓名":" B2","价格":60}]})

     

db.users.find({" items":{$ elemMatch:{price:{$ gt:30}}}})
  {" _id" :ObjectId(" 53e0c750e47ff836d16c66f4")," items" :[{" name" :" A2","价格" :40},{" name" :" B2","价格" :60}]}

答案 1 :(得分:0)

示例来自mongo shell。

  
      
  1. 选择文档内的数组中的子文档或对象,而不是检索父文档
  2.   

对于子文档,请使用projection

> db.test.insert({ "_id" : 0, "x" : 1, "y" : 2, "embedded" : { "foo" : "bar", "counts" : [1, 2, 3, 4] } })
> db.test.find({ "_id" : 0}, { "_id" : 0, "embedded" : 1})
{ "embedded" : { "foo" : "bar", "counts" : [ 1, 2, 3, 4 ] } }

对于数组中的对象,您也可以使用投影,但仅适用于从数组开头开始的切片

> db.test.insert({ "_id" : 1, "prices" : [100, 22, 63, 234] })
> db.test.find({ "_id" : 1}, { "_id" : 0, "prices" : { "$slice" : 2 } })
{ "prices" : [ 100, 22 ] }

或使用位置运算符$

匹配数组元素上的条件的第一个数组元素
> db.test.find({ "prices" : { "$lt" : 100 } }, { "_id" : 0, "prices.$" : 1 })
{ "prices" : [ 22 ] }

或与$elemMatch条件匹配的第一个元素:

> db.test.insert({ "_id" : 2, "users" : [{ "name" : Jill, "age" : 32 }, { "name" : Joe, "age" : 55 }, { "name" : Sam, "age" : 96 }])
> db.test.find({"_id" : 2}, { "users" : { "$elemMatch" : { "age" : { "$gt" : 50 } } } })
{ "_id" : 2, "users" : [ { "name" : "Joe", "age" : 55 } ] }
  

然后运行并再次在内存中搜索一个项目/子文档

这是什么意思?如果你澄清,我很乐意回答。 MongoDB根据需要将文档加载到内存中。如果一遍又一遍地查询同一组文档,只要整个集合适合内存(包括索引),它们就会驻留在内存中并从内存中提供。