Gre*_*nih 6 mongodb mongodb-query aggregation-framework
我正在使用MongoDB的聚合管道,以我想要的形式获取我的文档.作为聚合的最后一步,我$project用来将文档放入最终形式.
但我在投影和子文档数组时遇到了麻烦.这是我目前从aggrgation得到的:
{
"_id": "581c8c3df1325f68ffd23386",
"count": 14,
"authors": [
{
"author": {
"author": "57f246b9e01e6c6f08e1d99a",
"post": "581c8c3df1325f68ffd23386"
},
"count": 13
},
{
"author": {
"author": "5824382511f16d0f3fd5aaf2",
"post": "581c8c3df1325f68ffd23386"
},
"count": 1
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想$project在authors阵列,使得回报将是这样的:
{
"_id": "581c8c3df1325f68ffd23386",
"count": 14,
"authors": [
{
"_id": "57f246b9e01e6c6f08e1d99a",
"count": 13
},
{
"_id": "5824382511f16d0f3fd5aaf2",
"count": 1
}
]
}
Run Code Online (Sandbox Code Playgroud)
我将如何实现这一目标?
小智 14
我一直遇到同样的问题,刚刚找到了一个简单而优雅的解决方案,但没有在任何地方提到过,所以我想我会在这里分享:
您可以使用 $map 迭代数组并投影每个作者。对于给定的结构,聚合应该看起来像这样
db.collectionName.aggregate([
$project: {
_id: 1,
count:1,
authors: {
$map: {
input: "$authors",
as: "author",
in: {
id: "$$author.author.author",
count: $$author.author.count
}
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
希望这对像我一样正在寻找的人有所帮助:)
您可以在投射后将阵列展开并再次缠绕它.像这样的东西:
db.collectionName.aggregate([
{$unwind:'$authors'},
{$project:{_id:1,count:1,'author.id':'$authors.author.author','author.count':'$authors.count'}},
{$group:{_id:{_id:'$_id',count:'$count'},author:{$push:{id:'$author.id',count:'$author.count'}}}},
{$project:{_id:0,_id:'$_id._id',count:'$_id.count',author:1}}
])
Run Code Online (Sandbox Code Playgroud)
上面的输出将是:
{
"_id" : "581c8c3df1325f68ffd23386",
"author" : [
{
"id" : "57f246b9e01e6c6f08e1d99a",
"count" : 13.0
},
{
"id" : "5824382511f16d0f3fd5aaf2",
"count" : 1.0
}
],
"count" : 14.0
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5315 次 |
| 最近记录: |