1

我正在尝试做的事情:

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

如同

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 代码,即循环遍历结果集并过滤掉其他项目。

我想知道是否有办法只用查询来做到这一点。

4

3 回答 3

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})

让它起作用

因为您的项目是一个数组,如果您只想返回匹配的子项目,您必须使用位置运算符

  db.test.find({"items.histPrices":[10, 12]},{"name":1,'items.$':1})
于 2012-11-03T15:38:37.897 回答
0
db.test.aggregate({$unwind:"$items"}, {$match:{"items.histPrices":[10, 12]}})

但我不知道性能是否还可以。你必须用你的数据来验证它。

$unwind 的用法

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

db.test.aggregate({$match:{name:"record"}}, {$unwind:"$items"}, {$match:{"items.histPrices":[10, 12]}})
于 2012-11-03T11:16:36.183 回答
0

使用嵌入到文档中的数组时,最好的方法是黄建伟建议的方法。

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

现在命令看起来像:

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

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

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

于 2013-11-22T19:31:45.450 回答