简体   繁体   English

MongoDb聚合条件组和推送记录

[英]MongoDb aggregate conditional group and push record

I was trying run a conditional group and push.我正在尝试运行一个有条件的组并推送。 I don't know if it is possible with MongoDb aggregate or with NodeJs.我不知道 MongoDb 聚合或 NodeJs 是否可行。

I have attendance collection and shifts collection like below.我有如下所示的考勤收集和轮班收集。 And also created Playground for my current try Mongo Playground .并且还为我当前尝试的Mongo Playground 创建了 Playground

Attendances

[
    {
      "_id": "62206c873b2eaac4b15d42f9",
      "employee": "6220624b3b2eaac4b15d42e8",
      "createdAt": "2022-04-28T04:11:13.036Z"
    },
    {
      "_id": "62206b173b2eaac4b15d42f1",
      "employee": "6220624b3b2eaac4b15d42e8",
      "createdAt": "2022-04-28T04:22:04.573Z"
    },
    {
      "_id": "626cb9329a6fe1422b61d4e4",
      "employee": "622062023b2eaac4b15d42e6",
      "createdAt": "2022-04-30T04:21:06.965Z"
    },
    {
      "_id": "626e19409a6fe1422b61d4f5",
      "employee": "622062023b2eaac4b15d42e6",
      "createdAt": "2022-05-01T05:23:12.342Z"
    },
    {
      "_id": "626cb9329a6fe1422b61d4e6",
      "employee": "622062023b2eaac4b15d42e6",
      "createdAt": "2022-05-01T15:42:39.827Z"
    },
    {
      "_id": "626cb9329a6fe1422b61d4e5",
      "employee": "622062023b2eaac4b15d42e6",
      "createdAt": "2022-05-02T09:46:51.439Z"
    }
  ]

Shifts

[
    {
      "_id": "626965ee9a6fe1422b61d4b1",
      "employee": "6220624b3b2eaac4b15d42e8",
      "date": "2022-04-28",
      "name": "Day",
      "isNight": false
    },
    {
      "_id": "626965ee9a6fe1422b61d4b2",
      "employee": "622062023b2eaac4b15d42e6",
      "date": "2022-04-30",
      "name": "Night",
      "isNight": true
    },
    {
      "_id": "626965ee9a6fe1422b61d4b3",
      "employee": "622062023b2eaac4b15d42e6",
      "date": "2022-05-01",
      "name": "Night",
      "isNight": true
    }
  ]

My requirement is, if isNight === true then push the next attendance record to previous date.我的要求是,如果isNight === true则将下一个考勤记录推到上一个日期。

My required JSON should something like bellow.我需要的 JSON 应该如下所示。

[
    {
        "_id": {
            "createdAt": "2022-04-28",
            "employee": "6220624b3b2eaac4b15d42e8"
        },
        "attendances": [
            {
                "_id": "62206c873b2eaac4b15d42f9",
                "createdAt": "2022-04-28T04:11:13.036Z",
                "employee": "6220624b3b2eaac4b15d42e8"
            },
            {
                "_id": "62206b173b2eaac4b15d42f1",
                "createdAt": "2022-04-28T04:22:04.573Z",
                "employee": "6220624b3b2eaac4b15d42e8"
            }
        ],
        "shifts": [
            {
                "_id": "626965ee9a6fe1422b61d4b1",
                "date": "2022-04-28",
                "employee": "6220624b3b2eaac4b15d42e8",
                "isNight": false,
                "name": "Day"
            }
        ]
    },
    {
        "_id": {
            "createdAt": "2022-04-30",
            "employee": "622062023b2eaac4b15d42e6"
        },
        "attendances": [
            {
                "_id": "626cb9329a6fe1422b61d4e4",
                "createdAt": "2022-04-30T04:21:06.965Z",
                "employee": "622062023b2eaac4b15d42e6"
            },
            {
                "_id": "626e19409a6fe1422b61d4f5",
                "createdAt": "2022-05-01T05:23:12.342Z",
                "employee": "622062023b2eaac4b15d42e6"
            }
        ],
        "shifts": [
            {
                "_id": "626965ee9a6fe1422b61d4b2",
                "date": "2022-04-30",
                "employee": "622062023b2eaac4b15d42e6",
                "isNight": true,
                "name": "Night"
            }
        ]
    },
    {
        "_id": {
            "createdAt": "2022-05-01",
            "employee": "622062023b2eaac4b15d42e6"
        },
        "attendances": [
            {
                "_id": "626cb9329a6fe1422b61d4e6",
                "createdAt": "2022-05-01T15:42:39.827Z",
                "employee": "622062023b2eaac4b15d42e6"
            },
            {
                "_id": "626cb9329a6fe1422b61d4e5",
                "createdAt": "2022-05-02T09:46:51.439Z",
                "employee": "622062023b2eaac4b15d42e6"
            }
        ],
        "shifts": [
            {
                "_id": "626965ee9a6fe1422b61d4b2",
                "date": "2022-04-30",
                "employee": "622062023b2eaac4b15d42e6",
                "isNight": true,
                "name": "Night"
            }
        ]
    }
]

How can I do with MongoDb or NodeJs?我该如何处理 MongoDb 或 NodeJs?

It solved the problem for me.它为我解决了问题。

DB.json DB.json

This is your sample data. 这是您的示例数据。
let yourData = require('./DB.json')

// 1 Console output
console.log(yourData[1].shifts);

for (let index in yourData) {
    if (yourData[index].shifts[0].isNight) {
        yourData[index].shifts[0].date = yourData[index].attendances[1].createdAt.split("T")[0];
    }
}

// 2 Console output
console.log(yourData[1].shifts);

Script.js脚本.js

The node.js script to make changes. node.js 脚本进行更改。
 let yourData = require('./DB.json') // 1 Console output console.log(yourData[1].shifts); for (let index in yourData) { if (yourData[index].shifts[0].isNight) { yourData[index].shifts[0].date = yourData[index].attendances[1].createdAt.split("T")[0]; } } // 2 Console output console.log(yourData[1].shifts);

1 Console output 1 控制台 output

Before changes.改动前。

 [ { _id: '626965ee9a6fe1422b61d4b2', date: '2022-04-30', employee: '622062023b2eaac4b15d42e6', isNight: true, name: 'Night' } ]

2 Console output 2 控制台 output

After changes.改动后。

 [ { _id: '626965ee9a6fe1422b61d4b2', date: '2022-05-01', employee: '622062023b2eaac4b15d42e6', isNight: true, name: 'Night' } ]

I'm not sure if this is what you want, but it can be updated.我不确定这是否是您想要的,但可以更新。 does this answer your question:这回答了你的问题了吗:

db.shifts.aggregate([
  {
    $set: {
      date: {$dateFromString: {dateString: "$date"}},
      dateString: "$date"
    }
  },
  {
    $lookup: {
      from: "attendances",
      let: {
        employee: "$employee",
        date: "$date",
        isNight: "$isNight"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              "$and": [
                {$eq: ["$$employee", "$employee"]},
                {$lt: [{$toDate: "$createdAt"},
                    {$dateAdd: {startDate: "$$date", unit: "day", amount: 2}}
                  ]
                },
                {$gt: [{$toDate: "$createdAt"}, "$$date"]}
              ]
            }
          }
        }
      ],
      as: "attendances"
    }
  },
  {
    $set: {
      attendances: {
        $map: {
          input: "$attendances",
          as: "item",
          in: {
            $mergeObjects: [
              "$$item",
              {
                today: {
                  $cond: [
                    {
                      $eq: [
                        {
                          $dateToString: {
                            date: {
                              $toDate: "$$item.createdAt"
                            },
                            format: "%Y-%m-%d",
                            timezone: "Asia/Kolkata"
                          }
                        },
                        "$dateString"
                      ]
                    },
                    true,
                    false
                  ]
                }
              }
            ]
          }
        }
      }
    }
  },
  {
    $addFields: {
      attendancesOverNightCount: {
        $reduce: {
          input: "$attendances",
          initialValue: 0,
          in: {
            $add: ["$$value", {$cond: [{$eq: ["$$this.today", false]}, 1, 0]}]
          }
        }
      }
    }
  },
  {
    $set: {
      attendances: {
        $slice: [
          "$attendances",
          {
            $subtract: [
              {$size: "$attendances"},
              {
                $cond: [
                  {$eq: ["$isNight", true]},
                  {"$subtract": ["$attendancesOverNightCount", 1]},
                  "$attendancesOverNightCount"
                ]
              }
            ]
          }
        ]
      },
      shifts: [
        {
          _id: "$_id",
          employee: "$employee",
          isNight: "$isNight",
          name: "$isNight",
          date: "$dateString"
        }
      ]
    }
  },
  {
    $project: {
      shifts: 1,
      attendances: {
        $map: {
          input: "$attendances",
          as: "item",
          in: {
            createdAt: "$$item.createdAt",
            employee: "$$item.employee",
            _id: "$$item._id"
          }
        }
      },
      _id: {
        createdAt: "$date",
        employee: "$employee"
      }
    }
  }
])

Playground example游乐场示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM