簡體   English   中英

如何查詢具有多個數據庫引用關系的 mongo

[英]How to query mongo with multiple db ref relations

假設我有以下數據庫結構我有用戶集合

"users": [
    {
      "_id": "4775222e-8e4f-4f84-8dba-b097291bbd39",
      "surname": "Smith",
      "forename": "John"
    }
  ]

我有job_requests集合,它在 1 個字段中引用了用戶集合,如下所示:

"job_requests": [
    {
      "_id": "f4bdda3e-0e8d-4e8d-b070-7d01421f5a51",
      "description": "do something",
      "riskManager": {
        "$ref": "users",
        "$id": "4775222e-8e4f-4f84-8dba-b097291bbd39"
      }
    }
  ]

最后我有一個工作集合,它在 1 個字段中引用了job_requests集合:

"jobs": [
    {
      "_id": "someID",
      "description": "do something",
      "jobRequest": {
        "$ref": "job_requests",
        "$id": "f4bdda3e-0e8d-4e8d-b070-7d01421f5a51"
      }
    }
  ]

我需要一個查詢,該查詢將按 userId 返回所有作業,這意味着我需要找到該用戶的所有 job_requests,然后找到具有這些 job_requests 的所有作業。 我嘗試在MongoPlayground上使用 mongo 聚合,這有效但僅適用於 mongo 4.4.1

db.jobs.aggregate([
  {
    "$lookup": {
      "from": "job_requests",
      "localField": "jobRequest.$id",
      "foreignField": "_id",
      "as": "jobRequest"
    }
  },
  {
    "$unwind": "$jobRequest"
  },
  {
    "$match": {
      "jobRequest.riskManager.$id": "4775222e-8e4f-4f84-8dba-b097291bbd39"
    }
  }
])

並給我正確的結果。 問題是我的服務器是 4.2.8,在那個版本上這會產生錯誤“FieldPath 字段名稱可能不以 '$' 開頭。” 如何進行查詢,使其不會在 4.2.8 上中斷? 我無法重組數據,我需要擁有集合之間的所有這些關系。 我可能會補充說,在此之上的后端是 spring 數據 mongodb,所以我可以使用這些功能來構造查詢,但我想它歸結為 mongo QL 的 javascript。

作為建議在這個博客中也可以使用$ objectToArray,$ arrayElemAt$ addFields運營商來完成。

所以它變得像

db.jobs.aggregate([
  {
    "$addFields": {
      "jobRequest": {
        "$arrayElemAt": [
          {
            "$objectToArray": "$jobRequest"
          },
          1
        ]
      }
    }
  },
  {
    "$addFields": {
      "jobRequest": "$jobRequest.v"
    }
  },
  {
    "$lookup": {
      "from": "job_requests",
      "localField": "jobRequest",
      "foreignField": "_id",
      "as": "jobRequest"
    }
  },
  {
    "$addFields": {
      "jobRequest": {
        "$arrayElemAt": [
          "$jobRequest",
          0
        ]
      }
    }
  },
  {
    "$unwind": "$jobRequest"
  },
  {
    "$match": {
      "jobRequest.riskManager.$id": "4775222e-8e4f-4f84-8dba-b097291bbd39"
    }
  }
])

使用 mongo 時不惜一切代價避免 DbRef。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM