这是我在这里发表的第一篇文章,真的很有帮助。
我去寻找MongoDB aggregate result with two different keys 但无法获得相同的相关性。或者更确切地说,我可能无法遵守解决方案
问题是我有一个文件有不同键的集合。基于该密钥,结果数据将作为对象数组获得。 以下是集合结构
{
"_id" : ObjectId("58ec840e2573065a1e076db3"),
"uniqueid" : "24050951",
"productid" : "5149-1550DM-11",
"record_id" : 1
}
{
"_id" : ObjectId("58ec840e2573065a1e076db4"),
"task" : 1,
"record_id" : 1,
"judgement" : {
"2" : "Functional"
}
}
{
"_id" : ObjectId("58ec840e2573065a1e076db5"),
"qc" : 1,
"record_id" : 1,
"judgement" : {
"2" : "No Style"
}
}
{
"_id" : ObjectId("58ec840e2573065a1e076db6"),
"task" : 2,
"record_id" : 1,
"judgement" : {
"2" : "Functional"
}
}
{
"_id" : ObjectId("58ec840e2573065a1e076db6"),
"task" : 2,
"record_id" : 2,
"judgement" : {
"2" : "Functional"
}
}
我期待的输出是三个数组的对象
"task"-> Array(3)-> contains three records for record_id 1 and 2 and also one more for task 1 and 2 for record_id 1
"qc" -> Array(1)
"other" -> if the task or qc doesnot exist.
很容易将其作为mongo函数获取,您可以在其中编写javascript代码。但就我而言,使用聚合它有点复杂。 任何帮助将不胜感激
由于
答案 0 :(得分:0)
在这里你去!
db.data.aggregate([
{$group:{_id:null, task:{$push:"$task"}, qc:{$push:"$qc"}, other:{$pushAll:['$record_id','$judgement']} }}
])
注意:为了获得除task和qc之外的所有字段,请将这些键放在其他$ pushAll数组中,如图所示
答案 1 :(得分:0)
您可以$facet
点$match
检查字段的存在($exist
)。
db.collection.aggregate( [
{
$facet: {
"task": [
{ $match: { task: { $exists: 1 } } }
],
"qc": [
{ $match: { qc: { $exists: 1 } } },
],
"other": [
{ $match: {task: { $exists: 0 } , qc: { $exists: 0 } } },
]
}
}
])