【发布时间】:2022-11-12 15:34:55
【问题描述】:
我想删除 ($pull) 嵌套数组元素,其中元素的属性之一为 null 并且数组具有多个元素。
这是一个例子。在以下集合中,我想删除 Orders 数组中具有 Amount = null 并且 Orders 数组具有多个元素的元素。也就是说,我只想删除OrderId = 12 的元素,而不删除其他元素。
db.TestProducts.insertMany([
{
ProductDetails: { "ProductId": 1, Language: "fr" },
Orders: [
{ "OrderId": 11, "Amount": 200 },
{ "OrderId": 12, "Amount": null }
]
},
{
ProductDetails: { "ProductId": 2, Language: "es" },
Orders: [
{ "OrderId": 13, "Amount": 300 },
{ "OrderId": 14, "Amount": 400 }
]
},
{
ProductDetails: { "ProductId": 3, Language: "en" },
Orders: [
{ "OrderId": 15, "Amount": null }
]
}
]);
以下尝试基于谷歌搜索和一些其他 StackOverflow 答案的组合,例如Aggregate and update MongoDB
db.TestProducts.aggregate(
[
{ $match: { "Orders.Amount": { "$eq": null } } },
{ $unwind: "$Orders" },
{
"$group": {
"_id": {
ProductId: "$ProductDetails.ProductId",
Language: "$ProductDetails.Language"
},"count": { "$sum": 1 }
}
},
{ "$match": { "count": { "$gt": 1 } } },
{ "$out": "temp_results" }
],
{ allowDiskUse: true}
);
db.temp_results.find().forEach((result) => {
db.TestProducts.updateMany({"ProductDetails.ProductId": result._id.ProductId, "ProductDetails.Language": result._id.Language },
{ $pull: { "Orders": {"Amount": null } }})
});
这可行,但我想知道是否可以以更简单的方式完成,特别是如果可以删除聚合管道中的数组元素并避免额外的迭代(forEach)。
【问题讨论】:
标签: mongodb