3

我有两个收藏:

用户

{
    "_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数组。我希望有一个单一的对象。

4

1 回答 1

1

我认为这条管道可能会奏效:

[
  {
    "$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
    }
  }
]

蒙戈游乐场

如果有什么我遗漏的,请告诉我!

于 2020-09-08T00:05:23.200 回答