看起来真的很简单,任何语言都是4-5行。我真的被困住了!我已经拥有的是:
/* 1 */
{
"_id" : ObjectId("5ad078cc43c90bb8118b457b"),
"totalTime" : 323,
"qData" : [
{
"qId" : "123456",
"weight" : 38
},
{
"qId" : "654321",
"age" : 21
},
{
"qId" : "123456",
"age" : 14
},
{
"qId" : "654321",
"height" : 122
},
{
"qId" : "654321",
"weight" : 34
}
]
}
/* 2 */
{
"_id" : ObjectId("5ad084cc43c90bb8118b4583"),
"totalTime" : 312,
"qData" : [
{
"qId" : "123456",
"weight" : 42
},
{
"qId" : "654321",
"age" : 21
},
{
"qId" : "123456",
"age" : 15
},
{
"qId" : "654321",
"height" : 124
},
{
"qId" : "654321",
"weight" : 40
}
]
}
/* 3 */
{
"_id" : ObjectId("5ad0853143c90bf4088b457b"),
"totalTime" : NumberLong(20),
"qData" : [
{
"qId" : "123456",
"weight" : 48
},
{
"qId" : "654321",
"age" : 22
},
{
"qId" : "123456",
"age" : 19
},
{
"qId" : "654321",
"height" : 162
},
{
"qId" : "654321",
"weight" : 39
}
]
}还有我要去的地方。这只是在每个元素的qData数组中为每个document收集数据。文档(记录)根本不混合它们的数据(qData)。
/* 1 */
{
"_id" : ObjectId("5ad078cc43c90bb8118b457b"),
"totalTime" : 323,
"qData" : [
{
"qId" : "123456",
"weight" : 38,
"age" : 14
},
{
"qId" : "654321",
"age" : 21,
"height" : 122,
"weight" : 34
}
]
}
/* 2 */
{
"_id" : ObjectId("5ad084cc43c90bb8118b4583"),
"totalTime" : 312,
"qData" : [
{
"qId" : "123456",
"weight" : 42,
"age" : 15
},
{
"qId" : "654321",
"age" : 21,
"height" : 124,
"weight" : 40
}
]
}
/* 3 */
{
"_id" : ObjectId("5ad0853143c90bf4088b457b"),
"totalTime" : NumberLong(20),
"qData" : [
{
"qId" : "123456",
"weight" : 48,
"age" : 19
},
{
"qId" : "654321",
"age" : 22,
"height" : 162,
"weight" : 39
}
]
}我需要使用聚合框架来完成这个任务。已经尝试过$filter,与$map或$addToSet一起,已经花了10个小时在上面。找不到正确的组合。
更新:我忘了提到,我运行在3.4上,所以$mergeObjects不是一个没有更新的选项。
发布于 2018-04-13 17:58:44
您可以在3.6中尝试在聚合下面。
db.collection.aggregate([
{"$unwind":"$qData"},
{"$group":{
"_id":{"id":"$_id","qId":"$qData.qId"},
"totalTime":{"$first":"$totalTime"},
"mergedata":{"$mergeObjects":"$qData"}
}},
{"$group":{
"_id":"$_id.id",
"totalTime":{"$first":"$totalTime"},
"qData":{"$push":"$mergedata"}
}}
])对于3.4,可以使用下面的查询。
db.collection.aggregate([
{"$unwind":"$qData"},
{"$group":{
"_id":{"id":"$_id","qId":"$qData.qId"},
"totalTime":{"$first":"$totalTime"},
"arraydata":{"$push": {"$objectToArray":"$qData"}}
}},
{"$addFields":{"arraydata":{"$arrayToObject":{
"$reduce":{
"input":"$arraydata",
"initialValue":[],
"in":{"$concatArrays":["$$this","$$value"]}}
}}}},
{"$group":{
"_id":"$_id.id",
"totalTime":{"$first":"$totalTime"},
"qData":{"$push": "$arraydata"}
}}
])发布于 2018-04-16 09:36:37
从维拉姆的回答中得到最好的一件事。走维拉姆的道路也会产生一些噪音,比如:
{
"qId" : "123456",
"qId" : "123456",
"weight" : 48,
"age" : 19
}因此,我解决这个问题的方法是在减少数组的同时添加$setUnion:
$reduce : {
input:"$arraydata",
initialValue:[],
in:{ $setUnion : {$concatArrays:["$$this","$$value"]}}
}https://stackoverflow.com/questions/49822283
复制相似问题