我有一个嵌套的嵌入文档,看起来像这样。每个帖子都有 n 条评论,每条评论都有一个包含姓名和电子邮件 ID 的用户详细信息。
我只想将评论用户的姓名投影到列表中
{
"PostId":"Post001",
"Comments":[
{"_id": "001",
"CommentedBy":{
"_id":"User001",
"Name":"UserName001",
"email":"user001@eg.com"
}
},
{"_id": "002",
"CommentedBy":{
"_id":"User002",
"Name":"UserName002",
"email":"user001@eg.com"
}
},
{"_id": "003",
"CommentedBy":{
"_id":"User003",
"Name":"UserName003",
"email":"user001@eg.com"
}
}
]
}
我想通过使用 mongodb 的聚合管道将其转换为如下所示的内容。
{
"PostId":"Post001"
"Comments":[
{"_id": "001",
"CommentedBy":"UserName001",
},
{"_id": "002",
"CommentedBy": "UserName002"
},
{"_id": "003",
"CommentedBy": "UserName003"
}
]
}
使用 mongo 的投影查询提供一个 CommentedBy
列表,其中包含所有名称。 如何使用 mongo 的聚合查询来实现此目的。有没有办法在不使用 $unwind
.
我尝试过的查询以及得到的结果。
db.getCollection('post').aggregate([
{$project:{"Comments.CommentedBy":"$Comments.CommentedBy.Name"}}
])
{
"_id" : ObjectId("5b98b4cc3bb8c65aeacabd78"),
"Comments" : [
{
"CommentedBy" : [
"UserName001",
"UserName002",
"UserName003"
]
},
{
"CommentedBy" : [
"UserName001",
"UserName002",
"UserName003"
]
},
{
"CommentedBy" : [
"UserName001",
"UserName002",
"UserName003"
]
}
]
}
最佳答案
您可以尝试使用$map
聚合,并可以通过循环 Comments
数组来更改内部的键。
db.collection.aggregate([
{ "$project": {
"PostId": 1,
"Comments": {
"$map": {
"input": "$Comments",
"as": "comment",
"in": {
"_id": "$$comment._id",
"CommentedBy": "$$comment.CommentedBy.Name"
}
}
}
}}
])
关于mongodb - mongodb聚合中的项目嵌套嵌入文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52288594/