在Mongodb中,如何检索与条件匹配的对象的子集?

时间:2012-11-03 06:32:51

标签: mongodb mongoose

我正在尝试做什么:

过滤与给定条件匹配的集合的字段。我不想返回字段中的每个项目(这是一个项目数组),而只是想查看匹配的项目。

相似
select items from test where items.histPrices=[10,12]

它也类似于mongodb网站上的内容:http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields

以下是我一直在尝试的内容:

db.test.save({"name":"record", "items":[{"histPrices":[10,12],"name":"stuff"}]})
db.test.save({"name":"record", "items":[{"histPrices":[10,12],"name":"stuff"}, 
{"histPrices":[12,13],"name":"stuff"},{"histPrices":[11,14],"name":"stuff"}]})

db.test.find({},{"name":1,"items.histPrices":[10, 12]})

它将返回所有与items.histPrices匹配的对象:[10,12],包括items []中的所有项目。但我不希望那些不符合条件的那些。

从两年前Mongodb留下的评论中,只获得带有该histPrices [10,12]的项目的解决方案是使用javascript代码,即循环遍历结果集并过滤掉其他项目。

我想知道是否有办法只使用查询。

3 个答案:

答案 0 :(得分:3)

您的find查询错误

   db.test.find({},{"name":1,"items.histPrices":[10, 12]})

你的条件语句应该在find语句的第一部分。在你的查询中{}表示获取所有类似于这个sql的文件

   select items from test (no where clause)

你必须将你的mongodb发现改为

   db.test.find({"items.histPrices":[10, 12]},{"name":1})

让它发挥作用

因为您的商品是数组,如果您只想返回匹配的子商品,则必须使用positional operator

  db.test.find({"items.histPrices":[10, 12]},{"name":1,'items.$':1})

答案 1 :(得分:0)

db.test.aggregate({$unwind:"$items"}, {$match:{"items.histPrices":[10, 12]}})

但我不知道表现是否合适。您必须使用您的数据进行验证。

The usage of $unwind

如果您想添加一些过滤条件,例如name="record",请先添加另一个$march,例如:

db.test.aggregate({$match:{name:"record"}}, {$unwind:"$items"}, {$match:{"items.histPrices":[10, 12]}})

答案 2 :(得分:0)

使用嵌入到文档中的数组时,最好的方法是Chien-Wei Huang建议的方法。

我只想添加另一个聚合,$group(如果文档很长,你可能不想检索它的所有内容,只有数组元素)运算符。

现在命令看起来像:

db.test.aggregate({$match:{name:"record"}}, 
{$unwind:"$items"}, 
{$match {"items.histPrices":[10, 12]}}, 
{$group: {_id: "$_id",items: {$push: "$items"}}});)

如果您有兴趣只返回每个集合中数组中的一个元素,那么您应该使用projection代替

这里解决了同样的问题: MongoDB Retrieve a subset of an array in a collection by specifying two fields which should match