sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:ステータス値が変更されるたびに滞留時間を計算します

    このソリューションが要件を満たしているかどうかを確認してください。

    説明

    1. 同じコレクションに参加します。したがって、各アイテムについて i アイテムi+ 1を受け取ります 。このメソッドは、presenceStatusの場所を示します。 変更されました。
    2. ドキュメントをフィルタリングしますii + 1 presenceStatusのペア は0 - 1 または1 - 0
    3. それらを単一のdataにグループ化します 配列。
    4. ここで、dataを繰り返し処理します 2ステップで(i=0;i<data.length;i+=2) updatedAtを取得します 値。
        var occupiedTime = data[i].tmp.updatedAt
        var vacantTime   = data[i+1].tmp.updatedAt
    
    1. 計算値をフラット化し、元のドキュメント構造を復元します。
    db.collection.aggregate([
      {
        $lookup: {
          from: "collection",
          let: {
            root_id: "$_id"
          },
          pipeline: [
            {
              $match: {
                $expr: {
                  $gt: [
                    "$_id",
                    "$$root_id"
                  ]
                }
              }
            },
            {
              $limit: 1
            }
          ],
          as: "tmp"
        }
      },
      {
        $match: {
          $or: [
            {
              "presenceStatus": 1,
              "tmp.presenceStatus": 0
            },
            {
              "presenceStatus": 0,
              "tmp.presenceStatus": 1
            }
          ]
        }
      },
      {
        $group: {
          _id: null,
          data: {
            $push: {
              $mergeObjects: [
                "$$ROOT",
                {
                  tmp: {
                    $arrayElemAt: [
                      "$tmp",
                      0
                    ]
                  }
                }
              ]
            }
          }
        }
      },
      {
        $addFields: {
          data: {
            $map: {
              input: {
                $range: [
                  0,
                  {
                    $size: "$data"
                  },
                  2
                ]
              },
              as: "idx",
              in: {
                "occupiedTime": {
                  $arrayElemAt: [
                    "$data.tmp.updatedAt",
                    {
                      $cond: [
                        {
                          $eq: [
                            {
                              $arrayElemAt: [
                                "$data.tmp.presenceStatus",
                                "$$idx"
                              ]
                            },
                            1
                          ]
                        },
                        "$$idx",
                        {
                          $add: [
                            "$$idx",
                            1
                          ]
                        }
                      ]
                    }
                  ]
                },
                "vacantTime": {
                  $arrayElemAt: [
                    "$data.tmp.updatedAt",
                    {
                      $cond: [
                        {
                          $eq: [
                            {
                              $arrayElemAt: [
                                "$data.tmp.presenceStatus",
                                "$$idx"
                              ]
                            },
                            0
                          ]
                        },
                        "$$idx",
                        {
                          $add: [
                            "$$idx",
                            1
                          ]
                        }
                      ]
                    }
                  ]
                },
                "created": {
                  $arrayElemAt: [
                    "$data.tmp.createdAt",
                    "$$idx"
                  ]
                },
                "_id": {
                  $arrayElemAt: [
                    "$data.tmp._id",
                    "$$idx"
                  ]
                },
                "__v": 0
              }
            }
          }
        }
      },
      {
        $unwind: "$data"
      },
      {
        $replaceRoot: {
          newRoot: "$data"
        }
      },
      {
        $addFields: {
          "dwellTime": {
            $dateToString: {
              date: {
                $toDate: {
                  $subtract: [
                    "$vacantTime",
                    "$occupiedTime"
                  ]
                }
              },
              format: "%H-%M-%S"
            }
          }
        }
      }
    ])
    

    MongoPlayground



    1. MongoDB $ millionsecond

    2. MongoDB $ tanh

    3. MongoDBシェルからレプリカセットにどのように接続しますか?

    4. Springdatamongodb-「カーソル」オプションが必要です