gpt4 book ai didi

mongodb - 如何在聚合投影上使用 $elemMatch?

转载 作者:行者123 更新时间:2023-12-01 19:31:14 33 4
gpt4 key购买 nike

这是我的对象:

{ "_id" : ObjectId("53fdcb6796cb9b9aa86f05b9"), "list" : [ "a", "b" ], "complist" : [ { "a" : "a", "b" : "b" }, { "a" : "c", "b" : "d" } ] }

这就是我想要完成的任务:检查“list”是否包含某个元素,并在读取文档时仅从“complist”上的对象中获取字段“a”,无论这些值如何。我正在构建一个论坛系统,这是将返回论坛详细信息的查询。我需要读取论坛信息,同时了解用户是否在论坛白名单中。

通过查找我可以使用查询

db.itens.find({},{list:{$elemMatch:{$in:["a"]}}})

仅获取与特定值匹配的第一个元素。这样我就可以检查返回的数组是否不为空,并且我知道“list”是否包含我正在查找的值。我无法在查询中执行此操作,因为我想要该文档,无论它包含我在“列表”值中查找的值。我需要该文档并知道“列表”是否具有特定值。

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

db.itens.aggregate({$project:{"complist.a":1}})

仅读取 complist 中包含的对象的字段“a”。这是要获取论坛帖子的基本信息,我不需要所有帖子的信息,只需要一些信息。

但是当我尝试使用查询时

db.itens.aggregate({$project:{"complist.b":1,list:{$elemMatch:{$in:["a"]}}}})

尝试同时执行这两项操作时,它会抛出一个错误,指出运算符 $elemMatch 无效。

我在这里对 $elemMatch 的总计做错了什么吗?有更好的方法来实现这一点吗?

最佳答案

相当老的问题,但实际上没有一个建议的答案是好的。

<小时/>

TLDR:

您不能使用$elemMatch$project阶段。但您可以使用其他聚合运算符(如 $filter)获得相同的结果.

db.itens.aggregate([
{
$project: {
compList: {
$filter: {
input: "$complist",
as: "item",
cond: {$eq: ["$$item.a", 1]}
}
}
}
}
])

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

<小时/>

深入解释:

首先我们来了解一下$elemMatch :

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

那又怎么样?这有什么关系呢?嗯$project stage 可以具有一定的输入结构,而我们想要使用的是:

<field>: <expression>

什么是有效的 expression

Expressions can include field paths, literals, system variables, expression objects, and expression operators. Expressions can be nested.

所以我们想使用expression operator ,但正如您从文档中看到的 $elemMatch 不是其中的一部分。因此它不是聚合 $project 阶段中使用的有效表达式。

关于mongodb - 如何在聚合投影上使用 $elemMatch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25528217/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com