簡體   English   中英

如何根據嵌套屬性的值有效地更新多個文檔?

[英]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.statuscompleted的文件,當找到文件時,我需要將外部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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM