Доступ к предыдущему документу в результате агрегации MongoDB - PullRequest
1 голос
/ 16 июня 2019

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

var result = db.collection.aggregate([...])

{
    "_id" : "2018-01",
    "month" : "2018-01",
    "count" : 283.0
}
{
    "_id" : "2018-02",
    "month" : "2018-02",
    "count" : 260.0
}
{
    "_id" : "2018-03",
    "month" : "2018-03",
    "count" : 287.0
}
{
    "_id" : "2018-04",
    "month" : "2018-04",
    "count" : 264.0
}
{
    "_id" : "2018-05",
    "month" : "2018-05",
    "count" : 292.0
}

Цель состоит в том, чтобы получить разницу между счетом в этом месяце и счетом в предыдущем. Таким образом, чтобы получить такие результаты:

{
    "_id" : "2018-01",
    "month" : "2018-01",
    "count" : 283.0,
    "difference" : 283.0
}
{
    "_id" : "2018-02",
    "month" : "2018-02",
    "count" : 260.0,
    "difference" : -23.0
}
{
    "_id" : "2018-03",
    "month" : "2018-03",
    "count" : 287.0,
    "difference" : 17.0
}

1 Ответ

1 голос
/ 16 июня 2019

Было бы легче помочь, если бы вы предоставили схему документа и агрегацию, которую вы используете, поскольку мы могли бы сделать это «динамически» на протяжении всего процесса.

С учетом сказанного мы можем простодобавьте 2 шага в конец вашей текущей агрегации.

Сначала (при условии, что ваши результаты не находятся в массиве), мы сгруппируем их, чтобы мы могли перебрать массив:

{
  $group: {
    _id: null,
    temp: {$push: "$$ROOT"}
  }
},
{ 
   "$project" : {
       _id: 0,
       "temp_field" : {
            "$reduce" : {
                "input" : "$temp", 
                 "initialValue" : {
                     "prev" : 0.0, 
                     "results" : []
                 }, 
                 "in" : {
                    "prev" : "$$this.count", 
                     "results" : {
                        "$concatArrays" : ["$$value.results", 
                                    [
                                        {
                                            "month" : "$$this.month", 
                                            "_id" : "$$this._id"
                                            "count" : "$$this.count", 
                                            "diff" : {
                                                "$subtract" : [
                                                    "$$this.count", 
                                                    "$$value.prev"
                                                ]
                                            }
                                        }
                                    ]
                                ]
                            }
                        }
                    }
                }
            }
        },

Наконец, нам просто нужно «восстановить» старый формат результата:

{
   $unwind: "$temp_field"
},
{
   $project: {
      _id: "$temp_field.results._id",
      count: "$temp_field.results.count",
      month: "$temp_field.results.month",
      difference: "$temp_field.results.diff"
   }
}

*** Примечание. На самом деле я неправильно вычисляю разницу (сопоставить месяц с предыдущим месяцем по значению), то есть еслиу вас есть пропущенные месяцы, вы должны позаботиться об этом заранее.а также сортировать массив по дате заранее, так как я просто использую предыдущий массив для выполнения вычитания.

...