英文:
Grouping MongoDB Data by Ignition Field Values: A Solution for Large Datasets
问题
{
"我想根据"ignition"字段的值对数据进行分组。如果"ignition"的值为1,则所有值为1的记录应该在遇到下一个值为0之前被分组在一起,依此类推。": "我想根据"ignition"字段的值对数据进行分组。如果"ignition"的值为1,则所有值为1的记录应该在遇到下一个值为0之前被分组在一起,依此类推。",
"我在MongoDB中有86400条记录,我想查询数据以实现所需的输出。": "我在MongoDB中有86400条记录,我想查询数据以实现所需的输出。",
"数据如下:": "数据如下:",
"[": "[",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"112": "112",
"193": "193",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"193": "193",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"0": "0",
",": ",",
"time": "时间",
"115": "115",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"116": "116",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"117": "117",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"118": "118",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"0": "0",
",": ",",
"time": "时间",
"119": "119",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"120": "120",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"121": "121",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"1": "1",
",": ",",
"time": "时间",
"122": "122",
"}": "}",
",": ",",
"{": "{",
"ignition": "点火",
"0": "0",
",": ",",
"time": "时间",
"123": "123",
"}": "}",
"]": "]",
"\n": "\n",
"\n": "\n",
"我想要的输出如下:": "我想要的输出如下:",
"{": "{",
"time": "时间",
":": ":",
"[": "[",
"112": "112",
",": ",",
"193": "193",
"]": "]",
",": ",",
"time": "时间",
":": ":",
"[": "[",
"116": "116",
",": ",",
"117": "117",
",": ",",
"118": "118",
"]": "]",
",": ",",
"time": "时间",
":": ":",
"[": "[",
"120": "120",
",": ",",
"121": "121",
",": ",",
"122": "122",
"]": "]"
}
英文:
I want to group the data based on the values of the "ignition" field. If the "ignition" value is 1, all records with the value 1 should be grouped together until the next value of 0 is encountered, and so on.
I have 86400 records in MongoDB, and I want to query the data to achieve the desired output.
The data looks like this:
[
  {
    ignition: 1,
    time: 112        
  },
  {
    ignition: 1,
    time: 193        
  },     
  {
    ignition: 0,
    time: 115        
  },
  {
    ignition: 1,
    time: 116        
  },
  {
    ignition: 1,
    time: 117        
  },
  {
    ignition: 1,
    time: 118        
  },
  {
    ignition: 0,
    time: 119        
  },
  {
    ignition: 1,
    time: 120        
  },
  {
    ignition: 1,
    time: 121        
  },
  {
    ignition: 1,
    time: 122        
  },
  {
    ignition: 0,
    time: 123        
  },
]
I want the output like this:
{
  time: [112,193],
  time: [116,117,118],
  time: [120,121,122]
}
答案1
得分: 1
db.collection.aggregate([
  {
    $setWindowFields: {
      partitionBy: null,
      sortBy: {time: 1},
      output: {
        "groupNum": {
          $sum: {
            $cond: [  
              {$eq: ["$ignition", 1]}, 0, 1
            ]
          },
          window: {
            documents: ["unbounded","current"]
          }
        }
      }
    }
  },
  {
    $match: {"ignition": 1}
  },
  {
    $group: {
      _id: "$groupNum",
      time: {$push: "$time"}
    }
  },
  {
    $sort: {_id: 1}
  }
])
英文:
db.collection.aggregate([
  {
    $setWindowFields: {                         //6. the output of this stage is, each set of adjacent documents having same $ignition will have a unique groupNum
      partitionBy: null,
      sortBy: {time: 1},                        //4. from all documents sorted by $time
      output: {
        "groupNum": {                           //1. create a new field groupNum
          $sum: {                               //2. by cumulatively adding
            $cond: [  
              {$eq: ["$ignition",1]}, 0, 1      //3. modified $ignition field
            ]
          },
          window: {
            documents: ["unbounded","current"]  //5. starting from the beginning to current document
          }
        }
      }
    }
  },
  {
    $match: {"ignition": 1}                     //7. retain $ignition : 1
  },
  {
    $group: {
      _id: "$groupNum",                         //8. group by groupNum
      time: {$push: "$time"}                    //9. pushing the time to an array
    }
  },
  {
    $sort: {_id: 1}                             //10.sort as necessary
  }
])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论