MongoDB Aggregation добавляет стоимость на основе документа в той же коллекции - PullRequest
0 голосов
/ 02 января 2019

У меня есть проблема с конвейером агрегации MongoDB, которую я не могу решить.

У меня есть следующий документ здесь ->

{ name: 'name', values: [ { value: 12, date: 2019-01-01 }, { value: 26, date: 2019-01-02 }, { value: 34, date: 2019-01-03 } ] }

У меня запущен конвейер агрегации, и я хочу вывести следующий документ с $ project ->

{ name: 'name', values: [ { value: 12, date: 2019-01-01, changeDay: 0 }, { value: 26, date: 2019-01-02, changeDay: 14 }, { value: 34, date: 2019-01-03, changeDay: 8 } ] }

То есть мне нужно, чтобы changeDay был вычитанием значения издокумент минус значение из документа, предшествующего этому, и так далее.

Надеюсь, я прояснил это достаточно.

Если это поможет - я пытаюсь запросить простой документ временного ряда по временному диапазону, и мне нужно вывести изменениезначение каждого дня.

Пока у меня есть эта агрегация MongoDB ->

`[
  {
    '$match': {
      'pageid': '36606016799'
    }
  }, {
    '$lookup': {
      'from': 'likes', 
      'localField': 'likes', 
      'foreignField': '_id', 
      'as': 'likes'
    }
  }, {
    '$unwind': {
      'path': '$likes'
    }
  }, {
    '$match': {
      'likes.date': {
        '$gte': Date('Sat, 29 Dec 2018 22:00:00 GMT'), 
        '$lte': Date('Tue, 01 Jan 2019 22:05:00 GMT')
      }
    }
  }, {
    '$group': {
      '_id': '$name', 
      'likes': {
        '$push': '$likes'
      }, 
      'picture': {
        '$first': '$$ROOT.picture'
      }
    }
  }, {
    '$project': {
      '_id': 1, 
      'picture': 1, 
      'likes': {
        'value': 1, 
        'change': {
          '$map': {
            'input': '$likes', 
            'as': 'like', 
            'in': {
              '$add': [
                '$$like.value', 100
              ]
            }
          }
        }
      }
    }
  }
]`

Вы можете видеть, что я пробовал $ map на последнем этапе $ проекта, но это не работаетздесь ... я не знаю, как я могу выбрать элемент перед тем, где находится курсор в данный момент, чтобы достичь его значения и вычесть ...

1 Ответ

0 голосов
/ 02 января 2019

Я не уверен, возможно ли это с конвейером агрегации. Но если это так, не стоит делать агрегацию такой сложной. Получите данные и затем выполните бизнес-логику на стороне сервера.

...