увеличивать или вычитать поле в каждом документе mongodb, используя агрегацию - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь сделать запрос к моей БД, но я не знаю, как выполнить этот запрос ... Я пытаюсь узнать, какой товар у меня есть в каждом документе на каждый документ

У меня есть эти документы ...

{
    _id: "6sdgsd5614sd12",
    type: 'purchase',
    date: '2020-04-11T20:33:14.021+00:00',
    products: [{
            _id: "62360asadc2q622",
            price: 542,
            units: 9
        }]
},
{
    _id: "34gf435345345f",
    type: 'purchase',
    date: '2020-04-12T50:51:14.691+00:00'.
    products: [{
            _id: "62360asadc2q622",
            price: 542,
            units: 5
        }]
},
{
    _id: "543g456g3344433",
    type: 'sales'
    date: '2020-04-13T20:12:14.011+00:00'
    products: [{
            _id: "62360asadc2q622",
            price: 542,
            units: 4
       }]
 },

Теперь я хотел бы добавить поле в каждый документ с запасом в этом конкретном моменте, например. Мой первый документ - это покупка, которую я купил 9 единиц, поэтому мой запас 9, за секунду я купил на 5 единиц больше, поэтому у меня 14, а за последние 4 продал 4, итоговый запас 10. Эти документы отсортированы по дате.

Мой ожидаемый результат: вывод, как это ...

{
    _id: "6sdgsd5614sd12",
    type: 'purchase',
    date: '2020-04-11T20:33:14.021+00:00',
    products: [{
            _id: "62360asadc2q622",
            price: 542,
            units: 9,
            stock: 9
        }]
},
{
    _id: "34gf435345345f",
    type: 'purchase',
    date: '2020-04-12T50:51:14.691+00:00'.
    products: [{
            _id: "62360asadc2q622",
            price: 542,
            units: 5,
            stock: 14
        }]
},
{
    _id: "543g456g3344433",
    type: 'sales'
    date: '2020-04-13T20:12:14.011+00:00'
    products: [{
            _id: "62360asadc2q622",
            price: 542,
            units: 4,
            stock: 10
       }]
 },

Я пытался агрегировать с $ in c и $ вычитать, но я не представляю, как это сделать, после сопоставления продукта я использую $ addFields но оператор $ in c я думаю, что не работает в агрегации ... кто-нибудь знает, как я могу это сделать? Помогите ... Благодарю

1 Ответ

2 голосов
/ 16 апреля 2020

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

Вы можете получить то, что ищете:

  • $sort по дате, поэтому все в правильном порядке
  • $unwind массив products, поэтому каждый документ имеет только 1 продукт
  • $group на product_id, добавляя исходные документы в массив
  • $addFields, используя $reduce для прохождения массива и предоставления каждому элементу инвентаря всего
  • $unwind этого массива
  • $group по исходным _id и $push продукт записывает обратно в массив.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...