MongoDB聚合功能

时间:2018-07-20 19:47:39

标签: mongodb

我有类似的文件:

Name    |     lastname      |     age   |    code  |  value
--------+-------------------+-----------+----------+--------
aaaaa   |     zzzzzzzzz     |     10    |    1     |   11
bbbb    |     eeeeeeeee     |     20    |    2     |   22
aaaaa   |     zzzzzzzzzzz   |     10    |    3     |   null
dddd    |     nnnnnnnn      |     20    |    4     |   null
aaaaa   |     zzzzzzzzzzz   |     10    |    5     |   null
bbbb    |     eeeeeeeee     |     20    |    6     |   null
aaaaa   |     zzzzzzzzzzz   |     10    |    7     |   77

使用MongoDB,我正在寻找给出该结果的请求:

  1. 检测具有空值的那些

  2. 将它们分组(仅为null值)并将所有代码写入一个字段:all_code;

  3. 检测是否存在其他相似的值不为null的相似项,并将它们与第2点的值分组,然后将所有这些值放入新的field=all_value中。

因此,它将类似于:

 Name   |     lastname     |     age    |    all_code    |  all_values
--------+------------------+------------+----------------+------------
aaaaa   |     zzzzzzzzz    |     10     |    3 , 5       |   11,77
bbbb    |     eeeeeeeee    |     20     |    6           |   22
dddd    |     nnnnnnnn     |     20     |    4           |   null

我已经尝试过了:

db.information.aggregate([
    {$group: 
      {
      _id:{
            name : "$name",
            lastename: "$lastename",
            age: "$age"
          },
      total:{$sum: 1},
      all_code:{ $addToSet: "$code" },
      all_values:{ $addToSet: "$value" }}},
    { $project: 
      {
    "name": 1,
    "lastename":1,
    "age":1,
    "all_code":1,
    "all_values":1,
    "total":1
    }},
    { $sort:{"total":-1}}
      ]) 

但是问题在于all_code列中,女巫必须仅在value = null处显示代码,并为已经有价值的人显示值。

1 个答案:

答案 0 :(得分:0)

所以,我认为这会起作用。我不确定,答案似乎太简单了,但是在Mongo中,我相信您想将{$ group}和{$ match}阶段分开,所以您只需在{$之前添加一个{$ match}阶段组}。如果您来自SQL环境,这可能会令人困惑,但这是休息时间。最后,我认为这在某种程度上会带来更灵活,更强大的结果。无论如何,我认为这可以解决您的问题:

db.information.aggregate([
{ $group: 
  {
  _id: {
        name : "$name",
        lastename: "$lastename",
        age: "$age"
      },
  total: {$sum: 1},
  all_code: { $addToSet: "$code" },
  all_values: {"$cond" : [{"$eq": [null, "$value"]} , null, {$addToSet: "$value"} }},
{ $project: 
  {
"name": 1,
"lastename":1,
"age":1,
"all_code":1,
"all_values":1,
"total":1
}},
{ $sort:{"total":-1}}
  ])