MongoDB比较两个集合并获得第三个集合
在我的mongodb中,我有几个集合,我想通过使用pymongo比较集合1和集合2来创建一个新集合 我想得到第三个集合,对于每个主题,通过Prof_name在collection2中找到匹配的主题,并在某个时间戳之间找到UUID和UUID_计数MongoDB比较两个集合并获得第三个集合,mongodb,mongodb-query,aggregation-framework,pymongo,Mongodb,Mongodb Query,Aggregation Framework,Pymongo,在我的mongodb中,我有几个集合,我想通过使用pymongo比较集合1和集合2来创建一个新集合 我想得到第三个集合,对于每个主题,通过Prof_name在collection2中找到匹配的主题,并在某个时间戳之间找到UUID和UUID_计数 Collection 1 : Object id timestamp Prof_Name subjects1 abc67478898k ISODate("2018-01-03T09: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
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.6中尝试下面的聚合 下面的代码将
subjects1
字符串拆分为字符串值数组,后跟以过滤集合2
文档中匹配的主题,并输出UUID
关于Prof_name
的文档,使用$addToSet
保持不同的UUID
和subjects1
,然后计数UUID
和subjects1
将响应写入新集合
db.collection_1.aggregate([
{"$addFields":{"subjects1":{"$split":["$subjects1",", "]}}},
{"$unwind":"$subjects1"},
{"$lookup":{
"from":"collection_2",
"let":{"subjects1":"$subjects1"},
"pipeline":[
{"$addFields":{"subjects2":{"$split":["$subjects2",","]}}},
{"$match":{"$expr":{"$in":["$$subjects1","$subjects2"]}}},
{"$project":{"UUID":1,"_id":0}}
],
"as":"ref_data"}},
{"$unwind":{"path":"$ref_data","preserveNullAndEmptyArrays":true}},
{"$group":{
"_id":"$Prof_Name",
"subjects_list":{"$addToSet":"$subjects1"},
"UUID_list":{"$addToSet":"$ref_data.UUID"}}},
{"$addFields":{
"Prof_name":"$_id",
"UUID_count":{"$size":"$UUID_list"},
"subject_count":{"$size":"$subjects_list"}}},
{"$project":{"_id":0}},
{"$out":"collection_3"}
])
您可以在3.6中尝试下面的聚合 下面的代码将
subjects1
字符串拆分为字符串值数组,后跟以过滤集合2
文档中匹配的主题,并输出UUID
关于Prof_name
的文档,使用$addToSet
保持不同的UUID
和subjects1
,然后计数UUID
和subjects1
将响应写入新集合
db.collection_1.aggregate([
{"$addFields":{"subjects1":{"$split":["$subjects1",", "]}}},
{"$unwind":"$subjects1"},
{"$lookup":{
"from":"collection_2",
"let":{"subjects1":"$subjects1"},
"pipeline":[
{"$addFields":{"subjects2":{"$split":["$subjects2",","]}}},
{"$match":{"$expr":{"$in":["$$subjects1","$subjects2"]}}},
{"$project":{"UUID":1,"_id":0}}
],
"as":"ref_data"}},
{"$unwind":{"path":"$ref_data","preserveNullAndEmptyArrays":true}},
{"$group":{
"_id":"$Prof_Name",
"subjects_list":{"$addToSet":"$subjects1"},
"UUID_list":{"$addToSet":"$ref_data.UUID"}}},
{"$addFields":{
"Prof_name":"$_id",
"UUID_count":{"$size":"$UUID_list"},
"subject_count":{"$size":"$subjects_list"}}},
{"$project":{"_id":0}},
{"$out":"collection_3"}
])
我收到的错误为pymongo.errors.OperationFailure:“subjects”以用户变量名的无效字符开头。我建议您在运行python应用程序之前,先在mongo shell中运行查询。这将确保当前查询没有错误。顺便说一句,我已经通过3.6MongoShell验证了这个查询。将更新的python查询添加到帖子中。您需要mongo server 3.6版本来运行此查询。另外,更新到新的驱动程序版本。驱动程序:{name:“MongoDB Internal Client”,version:“3.6.0”},上面的相同查询给出断言:命令失败:{“ok”:0,“errmsg”:“'subjects'以用户变量名的无效字符开头”,“code”:16867,“代码名”:“Location16867”}:aggregate failed根据我的实际集合名称更改字段名称let us。找到了它。它的用户变量名称以小写字母开头。我收到的错误为pymongo.errors.OperationFailure:“subjects”以用户变量名称的无效字符开头。我建议您在运行t之前先在mongo shell中运行查询通过python应用程序。这将确保当前查询没有错误。顺便说一句,我已经通过3.6 mongo shell验证了查询。将更新的python查询添加到帖子中。您需要mongo server 3.6版本来运行此查询。另外,更新到新的驱动程序版本。驱动程序:{name:“MongoDB Internal Client”,版本:“3.6.0”},与上述查询相同的是,assert:command失败:{“ok”:0,“errmsg”:“'subjects'以用户变量名的无效字符开头”,“code”:16867,“codeName”:“Location16867”}:aggregate failed根据我的实际集合名称更改字段名称let us。找到它。它的用户变量名称以小写字母开头。