MongoDB比较两个集合并获得第三个集合

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

在我的mongodb中,我有几个集合,我想通过使用pymongo比较集合1和集合2来创建一个新集合

我想得到第三个集合,对于每个主题,通过Prof_name在collection2中找到匹配的主题,并在某个时间戳之间找到UUID和UUID_计数

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。找到它。它的用户变量名称以小写字母开头。