Проблема заключается в том, что вы смешиваете обычную операцию обновления с операторами агрегации, чтобы использовать операторы агрегации в обновлении, вам нужно обернуть часть обновления в []
, чтобы сказать, что это на самом деле конвейер агрегации.
Запуск Версия 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] }
}
}
]);
Примечание. :
Поскольку здесь мы используем конвейер агрегирования, вам необходимо использовать операторы агрегирования, а использование нескольких операторов запроса / обновления не работает.