如何在 MongoDB 聚合管道中用数组字段替换根?

acm*_*une 3 mongodb aggregation-framework

假设我有一个users集合,其中一个roleIds字段包含Role引用数组。

db.users.aggregate([
  {$match:{ _id: ObjectId('5f9453b4484d206714c02a2f') }}, 
  {$project:{ roleIds: 1, _id: 0 }}, 
  {$unwind: "$roleIds"}, 
  {$lookup:{ from: "roles", localField: "roleIds", foreignField: "_id", as: "roles"}}, // <= STEP 4
  {$replaceRoot: "$roles"}
])
Run Code Online (Sandbox Code Playgroud)

在第 4 步之后,我得到了这样的结果:

{ 
  "roles" : [ 
    { "_id" : ObjectId("xxxx"), "name" : "role1" },
    { "_id" : ObjectId("xxxx"), "name" : "role2" },
  ]
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能把它改成这样:

[ 
  { "_id" : ObjectId("xxxx"), "name" : "role1" },
  { "_id" : ObjectId("xxxx"), "name" : "role2" },
]
Run Code Online (Sandbox Code Playgroud)

replaceRoot阶段似乎仅在角色字段是文档而不是数组时才起作用,在这种情况下它会引发错误。

acm*_*une 5

这有效:

db.users.aggregate([
  {$match:{ _id: ObjectId('5f9453b4484d206714c02a2f') }}, 
  {$project:{ roleIds: 1, _id: 0 }}, 
  {$unwind: "$roleIds"}, 
  {$lookup:{ from: "roles", localField: "roleIds", foreignField: "_id", as: "roles"}},
  {$unwind: "$roles"},
  {$replaceRoot: { newRoot: "$roles" }}
])
Run Code Online (Sandbox Code Playgroud)