我如何使用 MongoDB 的聚合和 $lookup 来替换包含整个文档的 id 的属性?

How can I use MongoDB's aggregate with $lookup to replace an attribute that holds an id with the whole document?

我有两个合集:

用户:

{
    "_id" : "9efb42e5-514d-44bd-a4b8-6f74e6313ec2",
    "name" : "Haralt",
    "age" : 21,
    "bloodlineId" : "c59a2d02-f304-49a8-a52a-44018fc15fe6",
    "villageId" : "foovillage"
}

血统:

{
    "_id" : "c59a2d02-f304-49a8-a52a-44018fc15fe6",
    "name" : "Tevla",
    "legacy" : 0
}

现在我想做一个聚合来用整个血统文档替换 user.bloodlineId。 这是我迄今为止尝试过的:

db.getCollection('character').aggregate([
{
    "$match": { _id: "9efb42e5-514d-44bd-a4b8-6f74e6313ec2" }
},
{
    "$lookup": {
        from: "bloodline",
        localField: "bloodlineId",
        foreignField: "_id",
        as: "bloodline"
    }
}])

结果和我想要的差不多:

{
    "_id" : "9efb42e5-514d-44bd-a4b8-6f74e6313ec2",
    "name" : "Haralt",
    "age" : 21,
    "bloodlineId" : "c59a2d02-f304-49a8-a52a-44018fc15fe6",
    "villageId" : "foovillage",
    "bloodline" : [ 
        {
            "_id" : "c59a2d02-f304-49a8-a52a-44018fc15fe6",
            "name" : "Tevla",
            "legacy" : 0
        }
    ]
}

这里只有两个问题。首先是 bloodlineId 仍然存在, bloodline 只是添加到结果中。我想让 bloodline 替换 bloodlineId 属性。

第二个问题是bloodline是一个数组。我很想让它成为一个对象。

我认为这条管道可以解决问题:

[
  {
    "$match": {
      _id: "9efb42e5-514d-44bd-a4b8-6f74e6313ec2"
    }
  },
  {
    "$lookup": {
      from: "bloodlines",
      localField: "bloodlineId",
      foreignField: "_id",
      as: "bloodline"
    }
  },
  {
    $project: {
      "age": 1,
      "bloodlineId": {
        $arrayElemAt: [
          "$bloodline",
          0
        ]
      },
      "name": 1,
      "villageId": 1
    }
  }
]

Mongo Playground

如果有任何遗漏,请告诉我!