gpt4 book ai didi

javascript - 将表达式应用于文档中的每个数组元素

转载 作者:行者123 更新时间:2023-11-30 15:02:26 25 4
gpt4 key购买 nike

我有一个示例文档,我正尝试在 MongoDB 聚合管道中进行投影。我正在使用大致如下所示的单个文档进行测试:

{
"_id" : "",
"title" : "Questions",
"sortIndex" : 0,
"topics" : [
{
"_id" : "",
"title" : "Creating a Question",
"sortIndex" : 1,
"thumbnail" : "CreatingAQuestion.jpg",
"seenBy" : [ "user101", "user202" ],
"pages" : [
{
"visual" : "SelectPlanets.gif",
"text" : "Some Markdown"
}
]
},
{
"_id" : "",
"title" : "Deleting a Question",
"sortIndex" : 0,
"thumbnail" : "DeletingAQuestion.jpg",
"seenBy" : [ "user101" ],
"pages" : [
{
"visual" : "SelectCard.gif",
"text" : "Some Markdown"
}
]
}
]
}

我试图获得的输出是这样的:

{
"_id" : "",
"title" : "Questions",
"topics" : [
{
"title" : "Creating a Question",
"thumbnail" : "CreatingAQuestion.jpg",
"seen" : true
},
{
"title" : "Deleting a Question",
"thumbnail" : "DeletingAQuestion.jpg",
"seen" : false
}
]
}

特别是我正在努力解决的问题是 seen旗帜。

我读过 docs哪个州:

When projecting or adding/resetting a field within an embedded document...

... Or you can nest the fields:

contact: { address: { country: <1 or 0 or expression> } }

我想使用一个表达式,我注意到了以下几点:

When nesting the fields, you cannot use dot notation inside the embedded document to specify the field, e.g. contact: { "address.country": <1 or 0 or expression> } is invalid.

所以我正在尝试弄清楚如何在表达式中“引用”子文档字段。这句话表明我不能使用点符号,但是当我似乎也无法使用嵌套符号时。到目前为止,这是我得到的:

db
.getCollection('chapters')
.aggregate([
{
$project: {
title: 1,
topics: {
title: 1,
thumbnail: 1,
publishedAt: 1,
test: "$seenBy",
seen: { $in: ["user202", "$seenBy"] },
}
}
}
])

所以我硬编码了user202现在进入我的查询,并希望看到 2 个文档的 truefalse。我还输入了 test字段映射出 seenBy来自子文档的字段。这产生的是:

{
"_id" : "",
"title" : "Questions",
"topics" : [
{
"title" : "Creating a Question",
"thumbnail" : "CreatingAQuestion.jpg",
"test" : [
"user101",
"user202"
],
"seen" : true
},
{
"title" : "Deleting a Question",
"thumbnail" : "DeletingAQuestion.jpg",
"test" : [
"user101",
"user202"
],
"seen" : true
}
]
}

显然我的“$seenBy”没有访问正确的主题,因为 test字段包含来自第一个文档的数据。

所以最终我的问题是,我怎样才能访问 seenBy子文档中的字段,引用当前子文档以便我可以创建表达式?

注意:我已经使用了多个 $project和一个 $unwind但想尝试压缩/清理一下。

最佳答案

你真的需要用$map这里。当您需要当前元素的本地化值时,简单地在投影中标记数组(这对 MongoDB 3.2 来说有点好处)并不能真正削减它。这就是您所需要的,这就是$map提供:

db.getCollection('chapters').aggregate([
{ $project: {
title: 1,
topics: {
$map: {
input: "$topics",
as: "t",
in: {
title: "$$t.title",
thumbnail: "$$t.thumbnail",
publishedAt: "$$t.publishedAt",
test: "$$t.seenBy",
seen: { $in: ["user202", "$$t.seenBy"] },
}
}
}}
])

因此,对于每个元素,"seenBy" 的当前值作为属性正在由表达式进行测试。没有 $map那是不可能的,您只能真正标记“整个”数组。这真的不是您想在这里测试的内容。

关于javascript - 将表达式应用于文档中的每个数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46298962/

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