![](/img/trans.png)
[英]Update nested object property based on the value of another property - JS
[英]How to update multiple documents efficiently based on the value of nested property?
好的,所以我需要根據其嵌套屬性值的值更新文檔。 假設我有這個文件:
{
"_id": "61e3050a465c380aec9f56a1",
"name": "John Doe",
"status": "pending",
"payment": [
{
"status": "completed"
},
{
"status": "completed"
}
]
}
我需要找到所有payment.status
已completed
的文件,當找到文件時,我需要將外部status
更新為已完成。
我可以在多個查詢中執行此操作並過濾掉已完成的查詢,但它會根據我認為效率不高的文檔數量進行大量查詢。 所以我在想的是,如果有辦法在一個查詢中做到這一點,可能是使用Aggregate
。
這是我的實現:
let orders = await Orders.find( {} ).populate( 'payments' );
let completedOrders = orders.filter( ( order ) => order.payments.every( ( payment ) => payment.status === 'completed' ) );
if ( completedOrders.length !== 0 ) {
for ( let order of completedOrders ) {
await Orders.findByIdAndUpdate( order._id, { "status": "completed" } );
}
}
您可以使用聚合管道進行更新。 使用$map
創建一個 boolean 數組來指示payment.status
是否“完成”。 然后使用$allElementsTrue
和$cond
有條件地更新外部status
字段。
db.collection.update({},
[
{
"$addFields": {
"status": {
"$cond": {
"if": {
"$allElementsTrue": {
"$map": {
"input": "$payment.status",
"as": "s",
"in": {
$eq: [
"$$s",
"completed"
]
}
}
}
},
"then": "completed",
"else": "$status"
}
}
}
}
])
這是Mongo游樂場供您參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.