После обновления до Mongo 4.0 я пытаюсь использовать новую функциональность $[]
Mongo. То, что я в основном пытаюсь сделать, это взять один или несколько идентификаторов «покрытия» и пройти через два массива, чтобы фильтровать обновления по совпадениям с теми, которые были переданы в идентификаторах «покрытия». Соответствующая часть моего кода выглядит так:
if (coverage) {
let arrCoverage = [];
arrCoverage = coverage.split(",");
if (arrCoverage) {
// convert each ID to a mongo ID
let mongoArrCoverage = arrCoverage.map(coverage => new mongo.ObjectID(coverage));
if (mongoArrCoverage) {
try {
let bulk = db.collection("customers").initializeUnorderedBulkOp();
let count = 0;
let batch = 1;
db.collection("customers")
.aggregate([
{
$match: {
"paymentOptions.coverages._id": {
$in: mongoArrCoverage
}
}
},
{
$unwind: "$paymentOptions"
},
{
$unwind: "$coverages"
},
{
$match: {
"coverages._id": {
$in: mongoArrCoverage
}
}
},
{
$project: {
_id: 0,
coverages_id: "$coverages._id",
"coverages.status": "$coverages.status"
}
}
])
.forEach(function(doc) {
let coverages_id = doc.paymentOptions.coverages_id;
bulk
.find({
"paymentOptions.coverages._id": coverages_id
})
.updateOne({
$set: {
"paymentOptions.$[].coverages.$[].coverageEnd": lastDayOfMonth,
"paymentOptions.$[].coverages.$[].status": doc.paymentOptions.coverages.status == "active" ? null : doc.paymentOptions.coverages.status,
"paymentOptions.$[].coverages.$[].lastAdvanceDate": today
}
});
count++;
if (count == batch) {
bulk.execute();
bulk = db.collection("customers").initializeUnorderedBulkOp();
count = 0;
}
});
if (count > 0) {
bulk.execute();
}
res.sendStatus(200);
} catch (e) {
console.log(e);
}
}
}
}
};
Но это, похоже, не делает ожидаемых обновлений. Я думаю, что проблема может быть в первоначальной агрегации, которую я делаю? Этот код выглядит правильно? В нашей предыдущей модели массив «покрытия» находился в корне документа. Теперь, когда это свойство в "paymentOptions", которое также является массивом, я предполагаю, что мне нужно $unwind
оба этих массива в моей первоначальной агрегации.
Кстати, соответствующая часть документа выглядит так:
{
_id: <ObjectId>,
someProp: <value>,
paymentOptions: [
{
_id: <ObjectId>,
otherProp: <value>,
coverages: [
{
_id: <ObjectId>, // Want to match on this
coverageStart: <Date>,
coverageEnd: <Date>, // Want to update this
status: "active"
},
{
_id: <ObjectId>, // Want to match on this
coverageStart: <Date>,
coverageEnd: <Date>, // Want to update this
status: "active"
}
]
}
]
}