Mongo db Aggregate — $ sum для добавления значений, если между датами

#javascript #node.js #mongodb #mongoose #mongodb-query

Вопрос:

Я хочу написать запрос для агрегирования количества на основе дат.

У меня есть документы, которые выглядят следующим образом:

 {
    "_id" : 1234,
    "itemNumber" : "item 1",
    "date" : ISODate("2021-10-26T21:00:00Z"),
    "quantity" : 1,
    "__v" : 0
}
 

И запрос, подобный этому:

 //monogoose 

myCollection.aggregate().group({
        _id: '$itemNumber',
        ninetyDays: {
            $sum: {
                $and: {
                    $gte: ["date", dayjs().subtract(90, 'd').toDate()],
                    $lt: ["date", dayjs().toDate()]
                }

            }
        }
    })
 

В приведенном выше запросе ninetyDays всегда 0.

Я в основном ищу, чтобы получить сумму количества, заданного в диапазоне дат.

Помощь очень ценится.

Спасибо

Ответ №1:

Вы можете использовать $cond для суммирования 1 или 0, если ваше условие соответствует.

Предполагая, что ваше выражение даты правильное, это должно сработать, но не подделывайте $ date .

 db.collection.aggregate([
  {
    "$group": {
      "_id": "$itemNumber",
      "ninetyDays": {
        "$sum": {
          "$cond": {
            "if": {
              "$and": [
                $gte: ["$date", dayjs().subtract(90, 'd').toDate()],
                $lt: ["$date", dayjs().toDate()]
              ]
            },
            "then": 1,
            "else": 0
          }
        }
      }
    }
  }
])
 

Пример здесь, где я использовал mongo $$NOW , но если ваша дата работает, проще использовать ваш код.

Комментарии:

1. Сработало как шарм. Я экспериментировал с этим, но иногда это немного сложно из документов. Спасибо!