0

在 mongodb 的新版本中有什么方法可以:

  1. 在文档内的数组中选择子文档或对象,而不是检索父文档,
  2. 然后运行并再次在内存中搜索项目/子文档。

假设一个用户文档中有一个项目列表,其中一个项目的价格超过 50 美元。
我只想要这个项目而不是检索用户文档,然后再次搜索某个项目。

我读到它可能会在下一个版本中出现,但找不到。谢谢 !

4

2 回答 2

0

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

因此,在您的情况下,它将如下所示:

db.users.insert({"items": [ {"name":"A1", "price":10}, {"name":"B1", "price":20}]})
db.users。插入({“项目”:[ {“名称”:“A2”,“价格”:40},{“名称”:“B2”,“价格”:60}]})

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

于 2014-08-05T12:04:39.880 回答
0

示例来自 mongo shell。

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

对于子文档,使用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 根据需要将文档加载到内存中。如果一遍又一遍地查询同一组文档,它们将驻留在内存中并从内存中提供,只要整个集合适合内存(包括索引)。

于 2014-08-05T16:15:37.933 回答