如何在将 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"
}
}
])
我有一个如下的用户文档,其中包含一个 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"
}
}
])