如何在将 uniqueID 存储为字符串并且 uniqueID 来自另一个集合而不是 objectID 的文档中填充数组

How to populate an array inside a document which stores uniqueID as strings and that uniqueID is from another collection rather than objectID

我有一个如下的用户文档,其中包含一个 systemID 数组,该数组对于另一个将 systemID 作为 unikey 键的集合是唯一的。如何使用所有系统 ID 详细信息填充用户?

用户文档:

{ 
    "_id" : ObjectId("6gfg85993266db5fdgs578"), 
    "email" : "xyz@gmail.com", 
    "role" : "user", 
    "systemIDs" : [
        "12345678", 
        "87654321"
    ], 
    "createdAt" : ISODate("2022-02-13T16:31:34.119+0000"), 
    "updatedAt" : ISODate("2022-02-13T16:31:34.119+0000"), 
    "__v" : NumberInt(0)
},

{ 
    "_id" : ObjectId("6gfg85993266db5fdgs578"), 
    "email" : "abc@gmail.com", 
    "role" : "user", 
    "systemIDs" : [
        "1111111",
        "2135684"
    ], 
    "createdAt" : ISODate("2022-02-13T16:31:34.119+0000"), 
    "updatedAt" : ISODate("2022-02-13T16:31:34.119+0000"), 
    "__v" : NumberInt(0)
}

系统 ID 文档:


{ 
    "_id" : ObjectId("62093fdsfsdfs97e1"), 
    "systemID" : "12345678", 
    "err" : [
        1, 5, 10
    ], 
    "__v" : NumberInt(0)
},

{ 
    "_id" : ObjectId("62093fdsfsdfs97e1"), 
    "systemID" : "87654321", 
    "err" : [
        3, 7
    ], 
    "__v" : NumberInt(0)
},

{ 
    "_id" : ObjectId("62087dsfsdfs97e1"), 
    "systemID" : "11111111", 
    "err" : [
        
    ], 
    "__v" : NumberInt(0)
},


我想找到用户持有的所有系统 ID 的详细信息,如果我使用电子邮件查询我的用户集合,结果如下所示:xyz@gmail.com,我应该得到以下结果或如图所示的填充结果:

{ 
    "_id" : ObjectId("6gfg85993266db5fdgs578"), 
    "email" : "xyz@gmail.com", 
    "role" : "user", 
    "systemIDs" : [
        { 
            "_id" : ObjectId("62093fdsfsdfs97e1"), 
            "systemID" : "12345678", 
            "err" : [
                1, 5, 10
            ], 
            "__v" : NumberInt(0)
        },

        { 
            "_id" : ObjectId("62093fdsfsdfs97e1"), 
            "systemID" : "87654321", 
            "err" : [
                3, 7
            ], 
            "__v" : NumberInt(0)
        },

    ]
    "createdAt" : ISODate("2022-02-13T16:31:34.119+0000"), 
    "updatedAt" : ISODate("2022-02-13T16:31:34.119+0000"), 
    "__v" : NumberInt(0)
},

我可以创建一个 foreach 循环并每次都调用数据库,但我认为这不是一个好的做法。 我是新手,所以请耐心等待并向我详细解释。

您可以使用 $match$lookup 的聚合来执行此任务

db.users.aggregate([
  {
    "$match": {
      "email": "xyz@gmail.com"
    }
  },
  {
    "$lookup": {
      "from": "systems",
      "localField": "systemIDs",
      "foreignField": "systemID",
      "as": "systemIDs"
    }
  }
])

demo