簡體   English   中英

Python 中的復雜 Mongo 查詢

[英]Complex Mongo query in Python

我有一個名為measurements的集合。 在這個集合中,只有三個字段: id (univoque)、 tmstamp (univoque) 和value 包含大於 0 的值的每一行都被視為警報。 從零狀態到下一個零狀態發生的所有警報都被視為一個事件。 我想以它以劇集格式返回數據的方式查詢數據。 也就是說,每一行都是一個情節。

為了更容易理解,我舉個例子:

{"id":1, tmstamp:1577644027, value:0}
{"id":2, tmstamp:1577644028, value:0}
{"id":3, tmstamp:1577644029, value:1}
{"id":4, tmstamp:1577644030, value:1}
{"id":5, tmstamp:1577644031, value:2}
{"id":6, tmstamp:1577644032, value:2}
{"id":7, tmstamp:1577644033, value:3}
{"id":8, tmstamp:1577644034, value:2}
{"id":9, tmstamp:1577644035, value:1}
{"id":10, tmstamp:1577644036, value:0}
{"id":11, tmstamp:1577644037, value:1}
{"id":12, tmstamp:1577644038, value:1}
{"id":13, tmstamp:1577644039, value:1}
{"id":14, tmstamp:1577644040, value:0}

鑒於這些數據,劇集將是:

episode1

{"id":3, tmstamp:1577644029, value:1}
{"id":4, tmstamp:1577644030, value:1}
{"id":5, tmstamp:1577644031, value:2}
{"id":6, tmstamp:1577644032, value:2}
{"id":7, tmstamp:1577644033, value:3}
{"id":8, tmstamp:1577644034, value:2}
{"id":9, tmstamp:1577644035, value:1}

episode2

{"id":11, tmstamp:1577644037, value:1}
{"id":12, tmstamp:1577644038, value:1}
{"id":13, tmstamp:1577644039, value:1}

我的問題是:有沒有什么方法可以在Mongo中查詢數據,從而獲得這種格式的結果,而不必在查詢本身之后進行這些操作?

您需要結合$facetArray expression operators
正如@aws_apprentice提到的,如果您知道以前的零狀態度量 id's$bucket會為您做這件事,因為邊界不接受表達式

因此,我們需要將零狀態和非零狀態數據分開。 讓我們稱它們為:警報(值 = 0)和劇集(值 > 1)。
對於alerts ,我們將每個帶有警報的測量值的_id存儲到數組中(我們需要它來過濾劇集)。 使用$indexOfArray$arrayElemAt我們可以獲取下一個 _id i+1 (過濾ii+1 id 之間的劇集)。

假設

我已將id替換為_id以執行聚合
你知道如何用Python語法翻譯 MongoDB 聚合命令

db.measurements.aggregate([
  {
    $facet: {
      alerts: [
        {
          $match: {
            value: 0
          }
        },
        {
          $group: {
            _id: "",
            ids: {
              $push: "$_id"
            }
          }
        }
      ],
      episodes: [
        {
          $match: {
            value: {
              $gt: 0
            }
          }
        }
      ]
    }
  },
  {
    $unwind: "$alerts"
  },
  {
    $addFields: {
      alert_idx: "$alerts.ids"
    }
  },
  {
    $unwind: "$alerts.ids"
  },
  {
    $project: {
      "k": {
        $concat: [
          "Episode",
          {
            $toString: {
              $indexOfArray: [
                "$alert_idx",
                "$alerts.ids"
              ]
            }
          }
        ]
      },
      "v": {
        $filter: {
          input: "$episodes",
          cond: {
            $and: [
              {
                $gt: [
                  "$$this._id",
                  "$alerts.ids"
                ]
              },
              {
                $lt: [
                  "$$this._id",
                  {
                    $arrayElemAt: [
                      "$alert_idx",
                      {
                        $sum: [
                          {
                            $indexOfArray: [
                              "$alert_idx",
                              "$alerts.ids"
                            ]
                          },
                          1
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        }
      }
    }
  },
  {
    $match: {
      "v": {
        $ne: []
      }
    }
  }
])

蒙戈游樂場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM