MongoDB聚合和分组用于不同的密钥名称

时间:2017-04-17 10:01:35

标签: mongodb

这是我在这里发表的第一篇文章,真的很有帮助。

我去寻找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代码。但就我而言,使用聚合它有点复杂。 任何帮助将不胜感激

由于

2 个答案:

答案 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 } } },
      ]
    }
  }
])