Как вычесть последние данные из любых двух моментов времени с помощью MongoDB

#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. Большое вам спасибо! это также решило мою проблему.