过滤与给定条件匹配的集合的字段。我不想返回字段中的每个项目(这是一个项目数组),而只是想查看匹配的项目。
与
相似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代码,即循环遍历结果集并过滤掉其他项目。
我想知道是否有办法只使用查询。
答案 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]}})
但我不知道表现是否合适。您必须使用您的数据进行验证。
如果您想添加一些过滤条件,例如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