जांचें कि क्या यह समाधान आपकी आवश्यकताओं को पूरा करता है।
स्पष्टीकरण
- हम एक ही संग्रह में शामिल होते हैं। तो प्रत्येक आइटम के लिए i हम आइटम लेते हैं i+1 . यह विधि हमें
presenceStatus
. कहां देती है बदल दिया गया है। - हम दस्तावेज़ को फ़िल्टर करते हैंi i+1 जोड़े जहां
presenceStatus
है0 - 1
या1 - 0
। - हम उन्हें एक
data
. में समूहित करते हैं सरणी। - अब हम
data
. पर पुनरावृति करते हैं 2 चरणों से(i=0;i<data.length;i+=2)
औरupdatedAt
. लें मूल्य।
var occupiedTime = data[i].tmp.updatedAt
var vacantTime = data[i+1].tmp.updatedAt
- हम परिकलित मानों को समतल करते हैं और मूल दस्तावेज़ संरचना को पुनर्स्थापित करते हैं।
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"
}
}
}
}
])
मोंगो खेल का मैदान