首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在聚合投影中使用$elemMatch?

如何在聚合投影中使用$elemMatch?
EN

Stack Overflow用户
提问于 2014-08-27 13:16:35
回答 7查看 57.6K关注 0票数 31

这是我的目标:

代码语言:javascript
复制
{ "_id" : ObjectId("53fdcb6796cb9b9aa86f05b9"), "list" : [ "a", "b" ], "complist" : [ { "a" : "a", "b" : "b" }, { "a" : "c", "b" : "d" } ] }

这就是我想要完成的:检查"list“是否包含某个元素,并在读取文档时只从"complist”上的对象中获取字段"a“,而不管这些值。我正在建立一个论坛系统,这是一个查询,将返回论坛的细节。我需要阅读论坛的信息,同时知道用户是否在论坛的白名单。

通过查找,我可以使用查询

代码语言:javascript
复制
db.itens.find({},{list:{$elemMatch:{$in:["a"]}}})

只获取与某个值匹配的第一个元素。这样,我就可以检查返回的数组是否为空,并且我知道"list“是否包含我要查找的值。我不能在查询上这样做,因为我想要文档,而不管它包含我在"list“值中寻找的值。我需要这份文件,并知道“列表”是否有一定的价值。

使用聚合,我可以使用查询

代码语言:javascript
复制
db.itens.aggregate({$project:{"complist.a":1}})

仅读取complist中包含的对象的"a“字段。这将得到论坛的线程基本信息,我不想要所有的信息的线程,只是几件事。

但是当我尝试使用查询时

代码语言:javascript
复制
db.itens.aggregate({$project:{"complist.b":1,list:{$elemMatch:{$in:["a"]}}}})

为了尝试这两种方法,它会抛出一个错误,说明操作符$elemMatch无效。

总的来说,我是不是对$elemMatch做错了什么?有什么更好的方法来实现这一点吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-08-27 14:16:42

嗯,碰巧您可以在find的投影块上使用"array.field“。

代码语言:javascript
复制
 db.itens.find({},{"complist.b":1,list:{$elemMatch:{$in:["a"]}}})

做我需要的事。

票数 -17
EN

Stack Overflow用户

发布于 2020-07-09 08:13:46

这是个老生常谈的问题,但从字面上讲,所有建议的答案都不是好的。

TLDR

您不能在$elemMatch阶段使用$project。但是,您可以使用其他聚合操作符(如$filter )实现相同的结果。

代码语言:javascript
复制
db.itens.aggregate([
    {
        $project: {
            compList: {
               $filter: {
                input: "$complist",
                as: "item",
                cond: {$eq: ["$$item.a", 1]}
               }
            }
        }
    }
])

如果您只希望数组中的第一项与类似于$elemMatch的条件相匹配,则可以合并$arrayElemAt

在深入解释

首先让我们了解一下$elemMatch

$elemMatch是一个查询表达式,而它的投影版本也存在,这指的是查询投影,而不是$project聚合阶段。

那又怎么样?这和任何事有什么关系?$project阶段具有特定的输入结构,而我们要使用的输入结构是:

什么是有效的表达式

表达式可以包括字段路径、文字、系统变量、表达式对象和表达式运算符。表达式可以嵌套。

所以我们想要使用表达式运算符,但是正如您从文档中看到的那样,$elemMatch并不是它的一部分。因此,它不是一个用于聚合$project阶段的有效表达式。

票数 29
EN

Stack Overflow用户

发布于 2016-04-15 15:24:35

由于某些原因,$elemMatch不能在聚合中工作。您需要在MONGO3.2中使用新的$filter操作符。请参阅https://docs.mongodb.org/manual/reference/operator/aggregation/filter/

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25528217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档