在Mongodb中,如何检索与条件匹配的对象子集? 我想做的是:

在Mongodb中,如何检索与条件匹配的对象子集? 我想做的是:,mongodb,mongoose,Mongodb,Mongoose,筛选与给定条件匹配的集合字段。我只想看到匹配的项,而不是返回字段中的每个项(这是一个项数组) 近似 select items from test where items.histPrices=[10,12] 它也类似于mongodb网站上的内容: 以下是我一直在尝试的: db.test.save({"name":"record", "items":[{"histPrices":[10,12],"name&

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

近似

select items from test where items.histPrices=[10,12]
它也类似于mongodb网站上的内容:

以下是我一直在尝试的:

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]})
它将返回与项匹配的所有对象。histPrices:[10,12],包括项[]中的所有项。但我不想要那些不符合条件的

根据两年前在Mongodb上留下的评论,仅获取具有histPrices[10,12]的项目的解决方案是使用javascript代码,即循环遍历结果集并过滤掉其他项目

我想知道是否有一种方法可以通过查询来实现这一点

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

您的
查找
查询错误

   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.aggregate({$match:{name:"record"}}, 
{$unwind:"$items"}, 
{$match {"items.histPrices":[10, 12]}}, 
{$group: {_id: "$_id",items: {$push: "$items"}}});)
如果希望从每个集合的数组中只返回一个元素,则应使用

这里解决了同样的问题:

这似乎更简单、更好。请在Mongodb.org上试用您的查询。第一个似乎是正确的,但第二个没有显示匹配项的历史价格:[{“名称”:“记录”,“项目”:[{}],“_id”:{“$oid”:“50955500cc93742e0d102047”},{“名称”:“记录”,“项目”:[{},{},{},{}],“_id”:{“$oid”:“5095550fcc93742e0d102048”}]但这在我的mongodb 2.2上有效。网页上写着:“注意:这个shell只支持真正的shell功能的一个子集。”也许这就是问题所在。是的,我在我的本地机器上再试了一次。它起作用了。prod服务器使用的是2.0.7版本,因此无法正常工作。下周将升级到2.2。Postional operator似乎是v1.4+的功能,让我再试一次。更新:它在2.0.7上似乎不起作用,完全相同的queryFirst失败,JS错误:TypeError:“undefined”不是一个函数(评估“db.test.aggregate”({$unwind:“$items”},{$match:{'items.histPrices':[10,12]}))。我明白了。您的查询是基于mongodb 2.2的聚合框架的吗?我使用的是2.1.x堆栈,所以这显然不起作用。是的,我的mongodb版本是2.2。@ttback 2.1.x是不稳定的开发版本;如果可能的话,您应该升级到2.2。@JohnnyHK发现prod服务器有2.0.7。升级将在下周进行,对此我非常高兴。我会在我的本地环境上试试,看看会发生什么。
db.test.aggregate({$match:{name:"record"}}, 
{$unwind:"$items"}, 
{$match {"items.histPrices":[10, 12]}}, 
{$group: {_id: "$_id",items: {$push: "$items"}}});)