MongoDB总有条件组和推送记录

发布于 2025-01-31 09:52:56 字数 4322 浏览 3 评论 0原文

我正在尝试运行有条件的小组并推动。我不知道MongoDB聚合或nodejs是可能的。

我有以下出勤收集和轮班收藏。还为我的当前尝试创建了游乐场 mongo Playground

出勤

[
    {
      "_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
    }
  ]

我的要求是,如果isning === true然后将下一个出勤记录推到上一个日期。

我所需的JSON应该像Bellow这样的东西。

[
    {
        "_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"
            }
        ]
    }
]

我该如何处理mongodb或nodejs?

I was trying run a conditional group and push. I don’t know if it is possible with MongoDb aggregate or with NodeJs.

I have attendance collection and shifts collection like below. And also created Playground for my current try Mongo 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.

My required JSON should something like bellow.

[
    {
        "_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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

愚人国度 2025-02-07 09:52:56

我不确定这是您想要的,但是可以进行更新。这是否回答您的问题:

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示例示例

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

月寒剑心 2025-02-07 09:52:56

它为我解决了问题。

DB.JSON

This is your sample data.

[
    {
        "_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"
            }
        ]
    }
]

脚本

The node.js script to make changes.

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号在更改之前输出

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

2个更改后的控制台输出

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

It solved the problem for me.

DB.json

This is your sample data.

[
    {
        "_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"
            }
        ]
    }
]

Script.js

The node.js script to make changes.

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

Before changes.

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

2 Console output

After changes.

[
  {
    _id: '626965ee9a6fe1422b61d4b2',
    date: '2022-05-01',
    employee: '622062023b2eaac4b15d42e6',
    isNight: true,
    name: 'Night'
  }
]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文