你能在MongoDB Compass中同时$展开几个字段吗



我正在使用MongoDB Compass对具有公共id字段的几个文档进行聚合。首先我尝试了以下方法:

db.data.aggregate([
$group : {
_id : "$id",
"id" : {$first : "$id"},
"email" : {$first : "$email"},
...
}])

然而,这个解决方案的问题是,对于某些字段,我得到的是null,而不是实际数据。我发现它是由$first操作引起的,为了解决这个问题,我使用了$addToSet操作而不是$first。所以上面的代码变成了:

db.data.aggregate([
$group : {
_id : "$id",
"id" : {$addToSet : "$id"},
"email" : {$addToSet : "$email"},
...
}])

在这之后,我没有遗漏任何数据,一切都很好。现在的问题是,对于每个字段,对应的值是一个只有一个字符串的数组。例如,在使用$addToSet之后,我得到以下结果:

{
"id" : "001",
"email" : Array(0: "asdf@gmail.com"),
"title" : Array(0: "title1")
...
}

我了解了CCD_ 7操作,它帮助我折叠数组并获得那个元素,但我想知道是否有一种方法可以";展开";同时处理所有元素,因为现在我必须逐个为每个键值对执行unwind阶段,这很耗时。

没有。CCD_ 9根据定义接收单个字段路径。

最简单的方法是在假设每个字段有一个组值的情况下使用arrayElemAt(如示例所示(。像这样:

db.collection.aggregate([
{
$group: {
_id: "$id",
"id": {
"$addToSet": "$id"
},
"email": {
$addToSet: "$email"
},
"title": {
$addToSet: "$title"
}
}
},
{
$project: {
_id: 1,
id: {
"$arrayElemAt": [
"$id",
0
]
},
email: {
"$arrayElemAt": [
"$email",
0
]
},
title: {
"$arrayElemAt": [
"$title",
0
]
}
}
}
])

Mongo游乐场

使用$concatArray,然后展开

最新更新