【发布时间】:2022-01-13 20:06:40
【问题描述】:
在 Python 3.9 中使用 Ubuntu 21.04、MongoDB Community 4.4.9、pymongo:
我正在将两个集合中的数据合并到一个共享密钥 membershipNumber 上。 membershipNumber 与另一个集合中的不同用户级标识符 an_user_id 相关联,并且应该是唯一的。但是,在许多情况下,单个 membershipNumber 有 n 个 an_user_ids。现在,这意味着我有很多重复的 membershipNumbers,导致出现重复的文档,其中除了 an_user_id 之外的所有内容在我新创建的集合中都是相同的。
为了规避这个问题,我希望发生以下情况:
- 只要有 >1 个
an_user_ids 与给定的membershipNumber匹配,我想创建一个数组,其中包含与新创建的membershipNumber匹配的ALLan_user_ids收集(使用$out) - 这样,集合中的每个membershipNumber 都是唯一的。
关于其实用性的一个问题仍然存在:这是否意味着我可以将通过an_user_id 链接的$merge 或$insert 数据以及从不同的集合/聚合链接到这个新创建的集合?
任何帮助将不胜感激。谢谢!
我拥有的工作代码(但不能防止重复):
p = [
{
'$project' : {
'_id' : 0,
'membershipNumber' : 1,
'address' : 1,
'joinDate' : 1,
'membershipType' : 1
}
},
# THE JOIN!!
{
'$lookup': {
'from': "an_users", # the other collection
'localField' : 'membershipNumber',
'foreignField' : 'memref',
'as': "details"
}
},
# retain unmatchable cases
{
'$unwind' : {
'path' : '$details',
'preserveNullAndEmptyArrays' : True
}
},
{
'$project' : {
'_id' : 0,
'membershipNumber' : 1,
'home' : 1,
'joinDate' : 1,
'membershipType' : 1,
'an_user_id' : '$details.user_id',
}
},
{
'$out' : {
'db' : 'mydb',
'coll' : 'new_coll'
}
}
]
members.aggregate(pipeline=p)
这就是(不需要的)重复数据在新集合中的样子:
{
"_id": 1,
"membershipNumber": "123456",
"membershipType": "STD",
"home: "Hogwarts",
"joinDate": {
"$date": "2000-01-01T00:00:00.000Z"
},
"an_user_id": "12345"
},
{
"_id": 2,
"membershipNumber": "123456",
"membershipType": "STD",
"home": "Hogwarts"
"joinDate": {
"$date": "2000-01-01T00:00:00.000Z"
},
"an_user_id": "12346"
}
这就是我喜欢它的样子...
{
"_id": 1,
"membershipNumber": "123456",
"membershipType": "STD",
"home": "Hogwarts"
"joinDate": {
"$date": "2000-01-01T00:00:00.000Z"
},
"an_user_id": ["12345", "12346"]
}
【问题讨论】:
-
为什么不保持
$lookup输出不变而不是$unwind? -
这不完全是您寻求的输出格式,但它会生成一个包含异物的对象数组并避免
$unwind。
标签: python mongodb join aggregation-framework pymongo