gpt4 book ai didi

mongodb - 展开后将元素 reshape 为数组

转载 作者:行者123 更新时间:2023-12-05 03:12:34 25 4
gpt4 key购买 nike

我有一个看起来像这样的集合

{ name: 'ABC', metadata.tables: [ { name: 'table1' }] }

基本上,我想在 metadata.tables 数组中查询以查找表名上的 elemMatch。我可以通过首先展开 metadata.tables 数组然后对表名执行 $match 来使用聚合管道来做到这一点。这工作正常,但现在 metadata.tables 变成了一个对象而不是数组。这是查询的样子

db.source.aggregate([ 
{ "$unwind": "$metadata.tables" },
{ $match: { "metadata.tables.name": "table 1" } }
])

返回的文档是这样的

{
"_id": "......",
"metadata": {
"tables": {
}
}
}

请注意,表格现在是对象而不是数组。我明白为什么 unwind 将它更改为一个对象,但我如何才能将它恢复为包含单个元素(匹配表)的数组。

谢谢

最佳答案

只需执行 $group$push :

db.source.aggregate([ 
{ "$unwind": "$metadata.tables" },
{ "$match": { "metadata.tables.name": "table 1" } },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"tables": { "$push": "$metadata.tables" }
}},
{ "$project": {
"name": 1,
"metadata": {
"tables": "$tables"
}
}}
])

以及可选的 $project,因为聚合累加器不能使用嵌入式字段进行输出,您需要像所示那样重命名。

您可以选择使用 $map如果您知道每个“展开”文档中只有一个元素或只是想要一个元素:

db.source.aggregate([ 
{ "$unwind": "$metadata.tables" },
{ "$match": { "metadata.tables.name": "table 1" } },
{ "$project": {
"name": 1,
"metadata": {
"tables": {
"$map": {
"input": ["A"],
"as": "el",
"in": "$metdata.tables"
}
}
}
}}
])

这实际上会将提供给“输入”的单个元素数组替换为字段的值。

关于mongodb - 展开后将元素 reshape 为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33359228/

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