【发布时间】:2018-01-29 06:01:53
【问题描述】:
在我的 mongodb 中,我的集合很少,我想通过使用 pymongo 比较集合 1 和集合 2 来创建一个新集合。
Collection 1 :
Object id timestamp Prof_Name subjects1
abc67478898k ISODate("2018-01-03T09:26:37.541Z") ABDC "sub1, sub2, sub3"
jjjjjjjjjj ISODate("2018-01-03T09:26:37.541Z") XYZ "sub2, sub4, sub8"
Collection 2 :
Object id timestamp UUID subjects2 rating score
3333333 ISODate("2018-01-03TZ") 7897 "sub1,sub4, sub7" 7 10
444444 ISODate("2018-01-03TZ") 4532 "sub2" 4 6
777777 ISODate("2018-01-03TZ") 7876 "sub1,sub2,sub3" 8 8
1111111 ISODate("2018-01-03TZ") 654 "sub1,sub3" 7 8
我正在获取我的 3 个集合,对于 Prof_name 的每个主题,在 collection2 中找到匹配的主题,并且某个时间戳和我的 mongo 查询之间的 UUID 和 UUID_count 如下:
db.data1.aggregate([
{"$lookup":{
"from":"data2",
"let":{"subject":{"$split":["$SUBJECT",", "]}},
"pipeline":[
{"$match": {"expr":{"$and":[{"$eq":[{"$year":"$timestamp"}, 2016]}, {"$eq":[{"$month":"$timestamp"}, 1]}]}}},
{"$addFields":{"SUBJECT_ID":{"$split":["$SUBJECT_ID",", "]},"SUBJECT":"$$subject"}},
{"$unwind":"$SUBJECT"},
{"$match":{"$expr":{"$in":["$SUBJECT","$SUBJECT_ID"]}}},
{"$facet":{
"UUID":[{"$group":{"_id":{"id":"$_id","UUID":"$UUID"}}},{"$count":"UUID_Count"}],
"REST":[
{"$group":{"_id":null,"subjects_list":{"$addToSet":"$SUBJECT"},"UUID_distinct_list":{"$addToSet":"$UUID"}}},
{"$addFields":{"subject_count":{"$size":"$subjects_list"},"UUID_distinct_count":{"$size":"$UUID_distinct_list"}}},
{"$project":{"_id":0}}
]
}},
{"$replaceRoot":{"newRoot":{"$mergeObjects":[{"$arrayElemAt":["$UUID",0]},{"$arrayElemAt":["$REST",0]}]}}}
],
"as":"ref_data"
}},
{"$unwind":{"path":"$ref_data","preserveNullAndEmptyArrays":true}},
{"$addFields":{"ref_data.Prof_Name":"$Prof_Name"}},
{"$replaceRoot":{"newRoot":"$ref_data"}},
{"$out":"data3"}
])
上面的查询给了我下面的集合。
Collection 3 :
objectid Prof_name subjects_list UUID_list UUID-count subject_count
12 ABDC sub1,sub2,sub3 7897,4532,7876,654 4 3
34 XYZ sub2,sub4,sub8 7897,4532,7876 2 3
现在我想为我的集合 3 获取另一列,其中显示每个主题的计数列表以及与每个主题关联的 UUID,类似这样 合集3:
objectid Prof_name subjects_list UUID_list UUID-count subject_count each_sub_count UUID-assocaited_sub
12 ABDC sub1,sub2,sub3 7897,4532,7876,654 4 3 sub1:3,sub2:2,sub3:2 [sub1:7897,7876,654, sub2:4532,7876, sub3:7876]
34 XYZ sub2,sub4,sub8 7897,4532,7876 2 3 sub2:2,sub4:1,sub8:0 [sub2:4532,7876, sub4:7897,sub8:0]
最后两列是我需要的,我如何实现这一点,可以修改上面的查询并获取它或者获取这些列的新查询是什么。
【问题讨论】:
-
@Veeram 你能看看这个
-
@Veeram 如何修改此查询以添加来自集合 1 和集合 2 的新列。例如,集合 1 中的“时间戳”列和集合 3 中集合 2 的评级列(数据 3)
标签: python mongodb mongodb-query aggregation-framework