同一集合中的 Mongoose $lookup 不起作用

Mongoose $lookup in same collection doesn't work

我有以下数据集,其中我有两种类型的对象由字段 lType 区分,可以是 baseextra。 extra 有一个 base 位置的引用。

    [
            {
                "_id": "622b6f1c7a0aca9aa252756c",
                "country": "US",
                "county": "Florida",
                "city": "Miami",
                "lType": "base",
                "displayString": "Florida,Miami",
                "__v": 0
            },
            {
                "_id": "622b6f1d7a0aca9aa252756e",
                "landmark": "Gas station",
                "baseLocation": "622b6f1c7a0aca9aa252756c",
                "lType": "extra",
                "displayString": "Florida,Miami,Gas station",
                "__v": 0
            },
            {
                "_id": "622b6f4c5d0fe602a18826a7",
                "country": "US",
                "county": "Florida",
                "city": "Tampa",
                "lType": "base",
                "displayString": "Florida,Tampa",
                "__v": 0
            },
            {
                "_id": "622b6f4c5d0fe602a18826a9",
                "landmark": "Downtown",
                "baseLocation": "622b6f4c5d0fe602a18826a7",
                "lType": "extra",
                "displayString": "Florida,Tampa,Downtown",
                "__v": 0
            }
    ]

当我尝试像这样进行聚合查找时

    const location = await Location.collection.aggregate([{
      $lookup: {
        from: 'location',
        localField: 'baseLocation',
        foreignField: '_id',
        as: 'locationData'
      }
    }]).toArray();

尽管我的 baseLocation 字段是指向 base 位置对象的 ObjectId,但我在 locationData 中为我的 extra 位置获得了一个空数组。

我觉得你打错了。而不是 from: 'location',它应该是 from: 'locations'.

尝试像这样更改您的代码:

const location = await Location.collection.aggregate([{
  $lookup: {
    from: 'locations',
    localField: 'baseLocation',
    foreignField: '_id',
    as: 'locationData'
  }
}]);

Working example

如果您需要更多“深度”链接位置,您可以使用 "$graphLookup"

[在加油站找到糖果机。]

db.locations.aggregate([
  {
    "$graphLookup": {
      "from": "locations",
      "startWith": "$baseLocation",
      "connectFromField": "baseLocation",
      "connectToField": "_id",
      "as": "locationData"
    }
  }
])

mongoplayground.net 上试用。