Данный 1-й блок кода - это образец данных, а второй блок - мой желаемый результат. Какой запрос необходим для добавления полей Статистика машины в MongoDB Итак, мой желаемый результат таков (в основном добавление всех полей в массив статистика машины)
{
"date" : ISODate("2022-04-01T00:00:00.000Z"),
"intervalName" : "Shift A",
"operatorId" : "85875678",
"__v" : 0,
"clientId" : "ywegduywy",
"createdAt" : ISODate("2022-05-05T07:33:08.183Z"),
"deleted" : false,
"machineStats" : [
{
"idleTime" : 10,
"breaks" : 10,
"loading" : 10,
"unloading" : 10,
"runtime" : 11,
"total" : 100,
"activity" : {}
},
{
"idleTime" : 10,
"breaks" : 10,
"loading" : 10,
"unloading" : 10,
"runtime" : 10,
"total" : 100,
"activity" : {}
}
],
"plantId" : "AACCS3034M-SEZ-01",
"totalActivity" : 10,
"totalAll" : 100,
"totalBreaks" : 10,
"totalIdleTime" : 10,
"totalLoadUnload" : 10,
"totalRuntime" : 10,
"updatedAt" : ISODate("2022-05-05T07:33:30.213Z")
}
Желаемый результат, который я хочу (в основном добавление всех полей в массив статистика машины, кроме действий)
{
"date" : ISODate("2022-04-01T00:00:00.000Z"),
"intervalName" : "Shift A",
"operatorId" : "495632582487",
"__v" : 0,
"clientId" : "AACCS3034M",
"createdAt" : ISODate("2022-05-05T07:33:08.183Z"),
"deleted" : false,
"machineStats" : [
{
"idleTime" : 20,
"breaks" : 20,
"loading" : 20,
"unloading" :20,
"runtime" : 21,
"total" : 200,
"activity" : {}
},
],
"plantId" : "AACCS3034M-SEZ-01",
"totalActivity" : 10,
"totalAll" : 100,
"totalBreaks" : 10,
"totalIdleTime" : 10,
"totalLoadUnload" : 10,
"totalRuntime" : 10,
"updatedAt" : ISODate("2022-05-05T07:33:30.213Z")
}
🤔 А знаете ли вы, что...
MongoDB позволяет хранить большие объемы данных, включая файлы и изображения, с использованием GridFS...
Вы можете использовать методы карта и уменьшать для выполнения такого рода вычислений в запросе монго.
Один из способов сделать это — использовать $reduce
для перебора массива и добавления данных каждого элемента к кумулятивным данным, например:
db.collection.aggregate([
{
$set: {
machineStats: {
$reduce: {
input: "$machineStats",
initialValue: {
idleTime: 0,
breaks: 0,
loading: 0,
unloading: 0,
runtime: 0,
total: 0
},
in: {
idleTime: {$add: ["$$value.idleTime", "$$this.idleTime"]},
breaks: {$add: ["$$value.breaks", "$$this.breaks"]},
loading: {$add: ["$$value.loading", "$$this.loading"]},
unloading: {$add: ["$$value.unloading", "$$this.unloading"]},
total: {$add: ["$$value.total", "$$this.total"]},
runtime: {$add: ["$$value.runtime", "$$this.runtime"]}
}
}
}
}
}
])
Другой вариант — использовать $unwind
и $group
, но он должен быть менее эффективным для этого конкретного запрошенного вывода.