簡體   English   中英

使用 MongoDb 更新對象數組中的多個屬性

[英]Update multiple properties in array of objects with MongoDb

我有一個這樣的對象數組:

vale { 
  cantidad: 23
  historial {
    entradas:[
             {cantidad: 5}, 
             {cantidad:10}, 
             {cantidad:8}
           ]
    salidas:[]
          } 
}

我想做一個 mongo 查詢,給定某個“cantidad”,它將從“entradas 數組”中減去它

例如,如果我想在最后減去 7,object 將如下所示:

vale { 
  cantidad: 16
  historial {
    entradas:[
             {cantidad: 0}, 
             {cantidad: 8}, 
             {cantidad:8}
           ]
    salidas:[]
          } 
}

所以現在 cantidad 是 16 並且“entradas”數組將第一個放在“0”中,然后將剩余的值減去下一個,如果我會減去 17,那么 entradas 數組應該如下所示:

  entradas:[
             {cantidad: 0}, 
             {cantidad: 0}, 
             {cantidad:6}
           ]

The process should be like: 
value = 17
(entradas[0] - value < 0) --> true
then
value -= entradas[0]; entradas[0] = 0 --> value is now 12
then
(entradas[1] - value < 0) --> true
then
value -= entradas[1]; entradas[1] = 0 --> value is now 2
then
(entradas[2] - value < 0) --> false
then
entradas[2] -= value --> value is now 0

我正在嘗試學習 mongoDb 的高級查詢,但老實說,我不知道如何做到這一點,或者在 MongoDb 查詢中是否可能。 “cantidad”和所有“entradas.cantidad”的總和將始終相同,我確保在進行此更新之前驗證該值小於總量。

希望有人可以幫助我:)

這是使用聚合管道的一種方法,盡管您最好先獲取文檔,然后在應用程序中修改它,然后再更新它。 如果您只想通過 MongoDB 執行此操作,請嘗試以下操作:

db.collection.aggregate([
  {
    "$match": {
      cantidad: 23
    }
  },
  {
    "$addFields": {
      "newDoc": {
        "$function": {
          "body": "function(data, value) { data.cantidad = data.cantidad - value; data.historial.entradas = data.historial.entradas.map(entrada => { let copy = entrada.cantidad; entrada.cantidad = Math.max(entrada.cantidad-value, 0); value = Math.max(value - copy, 0); return entrada; }); return data; }",
          "args": [
            "$$ROOT",
            7
          ],
          "lang": "js"
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$newDoc"
    }
  },
  {
    "$merge": {
      "into": "collection",
      "on": "_id",
      "whenMatched": "replace",
      
    }
  }
])

這是操場鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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