【发布时间】:2018-06-16 04:30:20
【问题描述】:
我有 2 个收藏,如下所示。
数据1:
{ "_id" : , "timestamp" : ISODate("2016-01-05T07:42:37.312Z"), "Prof_Name" : "Jack ", "SUBJECT" : "Maths, Chemistry, Machinery1, Ele1" }
{ "_id" : , "timestamp" : ISODate("2016-01-05T07:42:37.312Z"), "Prof_Name" : "Mac", "SUBJECT" : "Chemistry, CS, German" }
数据2:
{ "_id" : ObjectId(""), timestamp" : ISODate("2016-08-05T07:42:37.312Z", "SUBJECT_ID" : "Maths", "ID" : "OI-12", "Rating" : 6, "UUID" : 8123 }
{ "_id" : ObjectId(""), timestamp" : ISODate("2017-09-05T07:42:37.312Z", "SUBJECT_ID" : "Maths, Machinery1, German", "ID" : "OI-134", "Rating" : 6, "UUID" : 8123 }
{ "_id" : ObjectId(""), timestamp" : ISODate("2016-01-05T07:42:37.312Z", "SUBJECT_ID" : "Machinery1, Maths, French, German", "ID" : "OI-32", "Rating" : 3, "UUID" : 8123 }
{ "_id" : ObjectId(""), timestamp" : ISODate("2016-01-05T07:42:37.312Z", "SUBJECT_ID" : "CS, Chemistry", "ID" : "OI-36", "Rating" : , "UUID" : 8124 }
我想在时间戳 2016 年 1 月到 2106 年 11 月之间获得 3 个集合,其中对于来自“data1”的每个 Prof_Name 和 SUBJECT 中的主题,检查它是否存在于“data2”中并将 UUID 和 UUID 计数为 1,如果在下一条记录中找到相同的主题,使 UUID 计数 =2,依此类推。这就是我的收藏的样子..
数据3:
{ "_id" : ,
"Prof_Name" : "Jack",
"Subjects_list" : [ "Maths", "Chemistry", "Machinery1"],
"UUID_list" : [8123, 8124 ],
"UUID_count" : 3, // Because UUID 8123 has present in 2 records which comes under 2016 timestamp
"subject_count" : 3 } // Ele1 is not mentioned because it has not been seen in any of the data2 record
{ "_id" : ,
"Prof_Name" : "Mac",
"Subjects_list" : [ "CS"],
"UUID_list" : [8124 ],
"UUID_count" : 1, // Because UUID 8123 has present in 2 records which comes under 2016 timestamp
"subject_count" : 1 }
我的汇总查询是:
db.data1.aggregate([
{
"$addFields": {
"SUBJECT": {
"$split": [
"$SUBJECT",
", "
]
}
}
},
{
"$unwind": "$SUBJECT"
},
{
"$lookup": {
"from": "data2",
"let": {
"subject": "$SUBJECT"
},
"pipeline": [
{
"$addFields": {
"SUBJECT_ID": {
"$split": [
"$SUBJECT_ID",
", "
]
}
}
},
{
"$match": {
"$expr": {
"$in": [
"$$subject",
"$SUBJECT_ID"
]
}
}
},
{
"$project": {
"UUID": 1,
"_id": 0
}
}
],
"as": "ref_data"
}
},
{
"$unwind": {
"path": "$ref_data",
"preserveNullAndEmptyArrays": true
}
},
{
"$group": {
"_id": "$Prof_Name",
"subjects_list": {
"$addToSet": "$SUBJECT"
},
"UUID_list": {
"$addToSet": "$ref_data.UUID"
}
}
},
{
"$addFields": {
"Prof_Name": "$_id",
"UUID_count": {
"$size": "$UUID_list"
},
"subject_count": {
"$size": "$subjects_list"
}
}
},
{
"$project": {
"_id": 0
}
},
{
"$out": "data3"
}
])
这个查询需要什么修改才能得到上面提到的集合数据3,主要是UUID_list和UUID-count和Subject_list。
还想知道如何在下面的查询聚合查询中匹配给定月份和年份但不是 iso 的记录的时间戳。
试过这个:
{ "$project": {"year":{"$year":"$timestamp"},"month":{"$month":"$timestamp"}}},{ "$match":{"year" :"2016","month": "01"}}
但确实有效。
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework pymongo aggregation