#node.js #mongodb
Вопрос:
Приведены примеры документов
[
{
"_id": "4d54cff54364000000004331",
"t": "2021-07-10T00:00:01.000Z",
"data": { "a": 222936, "b": 4824 }
},
{
"_id": "4d54cff54364000000004332",
"t": "2021-07-10T00:00:02.000Z",
"data": { "a": 223525, "b": 4863 }
},
{
"_id": "4d54cff54364000000004333",
"t": "2021-07-10T00:00:03.000Z",
"data": { "a": 223425, "b": 4892 }
},
{
"_id": "4d54d0074364000000004334",
"t": "2021-07-10T00:00:04.000Z",
"data": { "a": 223445, "b": 4905 }
}
]
Мне нужно вычесть «данные.а».
Как использовать одну командную строку aggregate для обработки этого требования.
В настоящее время я использую две командные строки aggregate и калькулятор на сервере nodejs.
подобный этому:
db.getCollection(`example`).aggregate([
{
$match: {
t: {$lte: ISODate("2021-07-10T00:00:04.454Z")},
}
},
{
$sort: {t: -1}
}, {
$limit: 1
}
])
Результат:
[
{
'_id': '4d54d0074364000000004334',
't': '2021-07-10T00:00:04.000Z',
'data': { 'a': 223445, 'b': 4905 },
},
];
И этот
db.getCollection(`example`).aggregate([
{
$match: {
t: {$lte: ISODate("2021-07-10T00:00:02.454Z")},
}
},
{
$sort: {t: -1}
}, {
$limit: 1
}
])
Результат
[
{
'_id': '4d54cff54364000000004332',
't': '2021-07-10T00:00:02.000Z',
'data': { 'a': 223525, 'b': 4863 },
},
];
После выполнения двух агрегатов я получаю документ и вычитаю оставшиеся данные.a = 80.
Я надеюсь, что просто используйте один агрегат для расчета этого.
Как это сделать?
Спасибо!!
Комментарии:
1. Привет, ваш вопрос не ясен, не могли бы вы, пожалуйста, подробнее рассказать, спасибо
Ответ №1:
«Реального» способа сделать это нет, лучше всего использовать фасет$, который просто позволяет вам писать несколько конвейеров как один, вот так:
db.collection.aggregate([
{
$match: {
t: {
$lte: ISODate("2021-07-10T00:00:04.454Z")
},
}
},
{
$sort: {
t: -1
}
},
{
$facet: {
first: [
{
$limit: 1
}
],
second: [
{
$match: {
t: {
$lte: ISODate("2021-07-10T00:00:02.454Z")
}
}
},
{
$limit: 1
}
]
}
},
{
$project: {
con: {
"$concatArrays": [
"$first",
"$second"
]
}
}
},
{
$unwind: "$con"
},
{
"$replaceRoot": {
"newRoot": "$con"
}
}
])
Комментарии:
1. Большое вам спасибо! это также решило мою проблему.