mongodb 使用管道查找,但不指定本地字段和外部字段

yizd12fk  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(127)
db.Products.aggregate([
  {
    $lookup: {
      from: "Products_History",
      localField: "_fid",
      foreignField: "_fid",
      as: "joins",
      pipeline: [
        {
          "$sort": {
            "date": -1
          }
        }
      ]
    }
  },
  {
    "$project": {
      "_fid": 1,
      "field1": 1,
      "field2": 1,
      "field3": 1,
      "last_version": {
        $first: "$joins.version"
      }
    }
  },
  {
    $match: {
      "last_version": {
        $exists: true
      }
    }
  }
])

当MongoDB为版本5或更高版本时,这一点非常有效。
然而,在我当前的版本中,我得到:“带有”pipeline“得$lookup不能指定”localField“或”foreignField“”
有没有一种方法可以在连接它们的同时修复查询?我不知道有没有其他方法可以做到这一点。
https://mongoplayground.net/p/SYsmjYjOdNJ

xxhby3vn

xxhby3vn1#

您可以使用老式的“let and match”语法。在$let子句中,f被设置为一个变量,以引用Products文档中的_fid字段。因此,查询将Products._fidProducts_History._fid(由$_fid引用)进行匹配。

db.Products.aggregate([
  {
    $lookup: {
      from: "Products_History",
      "let": {
        f: "$_fid"
      },
      as: "joins",
      pipeline: [
        {
          $match: {
            $expr: {
              $eq: [
                "$$f",
                "$_fid"
              ]
            }
          }
        },
        {
          "$sort": {
            "date": -1
          }
        }
      ]
    }
  },
  {
    "$project": {
      "_fid": 1,
      "field1": 1,
      "field2": 1,
      "field3": 1,
      "last_version": {
        $first: "$joins.version"
      }
    }
  },
  {
    $match: {
      "last_version": {
        $exists: true
      }
    }
  }
])

Mongo Playground

相关问题