Javascript 将表达式应用于文档中的每个数组元素
我有一个示例文档,我正试图在MongoDB聚合管道中投影它。我使用一个大致如下的文档进行测试:Javascript 将表达式应用于文档中的每个数组元素,javascript,mongodb,aggregation-framework,Javascript,Mongodb,Aggregation Framework,我有一个示例文档,我正试图在MongoDB聚合管道中投影它。我使用一个大致如下的文档进行测试: { "_id" : "", "title" : "Questions", "sortIndex" : 0, "topics" : [ { "_id" : "", "title" : "Creating a Question", "sortIndex" : 1,
{
"_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
标志
我已经阅读了以下国家的报告:
在嵌入文档中投影或添加/重置字段时
。。。也可以嵌套字段:
联系人:{地址:{国家:}}
我希望使用一个表达式,我注意到以下几点:
嵌套字段时,不能在嵌入文档中使用点符号来指定字段,例如,联系人:{“address.country”:}
无效
因此,我试图找出如何在表达式中“引用”子文档字段。这句话表明我不能使用点表示法,但当我似乎也不能使用嵌套表示法时。以下是到目前为止我得到的信息:
db
.getCollection('chapters')
.aggregate([
{
$project: {
title: 1,
topics: {
title: 1,
thumbnail: 1,
publishedAt: 1,
test: "$seenBy",
seen: { $in: ["user202", "$seenBy"] },
}
}
}
])
因此,我现在已经将user202
硬编码到我的查询中,并希望看到这两个文档的true和false。我还输入了一个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
,但想尝试压缩/清理一下。您确实需要在这里使用它。当您需要当前元素的本地化值时,简单地在投影中标记数组(这有点像MongoDB 3.2)并不能真正切割它。这就是您所需要的,也是您所提供的:
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
,但考虑到它的用途,它非常适合。我认为这些文件只是把我引向了错误的道路,因为听起来我应该能够做我想做的事情。