[英]MongoDb aggregate conditional group and push record
我正在嘗試運行一個有條件的組並推送。 我不知道 MongoDb 聚合或 NodeJs 是否可行。
我有如下所示的考勤收集和輪班收集。 並且還為我當前嘗試的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
}
]
我的要求是,如果isNight === true
則將下一個考勤記錄推到上一個日期。
我需要的 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"
}
]
}
]
我該如何處理 MongoDb 或 NodeJs?
它為我解決了問題。
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);
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);
改動前。
[ { _id: '626965ee9a6fe1422b61d4b2', date: '2022-04-30', employee: '622062023b2eaac4b15d42e6', isNight: true, name: 'Night' } ]
改動后。
[ { _id: '626965ee9a6fe1422b61d4b2', date: '2022-05-01', employee: '622062023b2eaac4b15d42e6', isNight: true, name: 'Night' } ]
我不確定這是否是您想要的,但可以更新。 這回答了你的問題了嗎:
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"
}
}
}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.