MongoDB聚合功能

问题描述 投票:0回答:1

我有这样的文件:

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. 检测是否有其他类似的值为非空值,并将它们与第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的代码,并为那些已经有价值的人提供价值。

mongodb
1个回答
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}}
  ]) 
© www.soinside.com 2019 - 2024. All rights reserved.