Похоже, что arrayFilters еще не поддерживается должным образом драйвером MongoDB node.js (начиная с (3.6.0).
Существует билет jira с обходным путем использования "raw": https://jira.mongodb.org/browse/NODE-2101
В заявке есть хороший пример драйвера vanilla node.js. Однако, если вы пытаетесь использовать Mon goose, вот еще одно решение, основанное на документации MongoDB. :
Документ MongoDB из коллекции "student3":
{
"_id" : 1,
"grades" : [
{ "type" : "quiz", "questions" : [ 12, 10, 5 ] },
{ "type" : "quiz", "questions" : [ 10, 11, 6 ] },
{ "type" : "hw", "questions" : [ 5, 4, 3 ] },
{ "type" : "exam", "questions" : [ 25, 10, 23, 0 ] }
]
}
Пн goose Код (MongoDb 4.2.8 с использованием Пн goose 5.9.28):
// @ts-ignore (required if "raw" is not part of @types)
const bulk = Students.collection.initializeOrderedBulkOp();
bulk.raw({
updateOne: {
updateOne: {
filter: {_id: mongoose.Types.ObjectId("5ed3243aa83d3a42ccff43e2")},
update: { $inc: { "grades.$[].questions.$[score]": 2 } },
arrayFilters: [ { "score": { $gte: 8 } } ]
}
}
});
Также я обнаружил, что вам нужно использовать $ eq в arrayFilters, если вы пытаетесь фильтровать на основе ObjectId.