Пн go условное агрегирование в рамках установленной операции - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь выполнить условное обновление записи MongoDB с помощью следующей транзакции.

db.collection(SESSIONS_COLLECTION)
  .updateOne({_id: ObjectId(id)},
    {
      $set: {
        end: {
          $cond: {
            if: { $gt: ["$end", latestActionDate] }, then: "$end", else: latestActionDate
          }
        }
      },
      $push: {
        actions: {
          $each: data.map(action => ({
            ...action,
            time: new Date(action.time)
          }))
        }
      }
    }
  );

Но все мои усилия сводятся на нет. MongoError: The dollar ($) prefixed field '$cond' in 'end.$cond' is not valid for storage. Возможно, такие операции просто не разрешены, но я предпочитаю думать, что мне здесь чего-то не хватает.

1 Ответ

0 голосов
/ 19 июня 2020

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

Запуск Версия MongoDB 4.2 вы можете update-with-an-aggregation-pipeline :

Код:

let actionArray = data.map((action) => ({
  ...action,
  time: new Date(action.time),
}));

db.collection(SESSIONS_COLLECTION).updateOne({ _id: ObjectId(id) }, [
  {
    $set: {
      end: {
        $cond: [{ $gt: ["$end", latestActionDate] }, "$end", latestActionDate]
      }
    }
  },  
  /** (fail safe stage) this second stage is optional but needed in general as `$push` will add a new array
   *  if that field doesn't exists earlier to update operation 
   * but `$concatArray` doesn't, So this helps to add `[]` prior to below step */
  {
    $set: { actions: { $ifNull: [ "$actions", [] ] } }
  },
  {
    $set: {
      actions: { $concatArrays: ["$actions", actionArray] }
    }
  }
]);

Примечание. :

Поскольку здесь мы используем конвейер агрегирования, вам необходимо использовать операторы агрегирования, а использование нескольких операторов запроса / обновления не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...