簡體   English   中英

使用節點更新 mongodb 中的嵌套對象數組

[英]Update nested array of objects in mongodb with node

我正在使用節點並嘗試使用嵌套對象數組中的日期戳更新數據。 我的數據結構如下:

{
_id:629f2f5e7aa147d6503957d0
kid_id:"629f2f5e7aa147d6503957ce"
inventory: [
    { size: "0", 
      purchased: "0", 
      used: [{}], 
      _id: "111111"
     },
    { size: "1", 
      purchased: "10", 
      used: [
            { date: "06/08/22", count: "2"}
       ], 
      _id: "222222"
      }
    ]
}

我想以大小 1 為目標並將另一個對象添加到“已使用”數組中 { date: "06/09/22", count: "4"}

長期目標,當有另一個具有現有日期的“計數”條目時,只需增加計數。 如果它是一個新日期,那就是我需要數組中的一個新對象。

我從下面的代碼開始,但這不正確:

router.put('/used', auth, async (req, res) => {
  let kidID = req.body.kid_id;
  let size = req.body.size;

  try {
    const record = await InventoryRecord.updateOne(
      { kid_id: kidID },
      { $inc: { 'inventory.$[el].used': -1 } },
      { arrayFilters: [{ 'el.size': size }] }
    );
    console.log(record);
    res.send(record);
  } catch (error) {
    res.send({ message: error.message });
  }
});

提前感謝您的幫助

你可以這樣做:

  1. 找到我們要更新的inventory項目並將其稱為replace
  2. 拆分replace為兩部分innerObj (帶有要編輯的日期的 obj)和innerOthers - 數組的其余部分
  3. 如果沒有匹配的文檔,請填寫innerObj
  4. innerObj的計數增加 1。
  5. innerOthersinnerObj合並回newObj
  6. newObj合並到inventory中。
db.collection.aggregate([
  {$addFields: {
      replace: {
        $first: {
          $filter: {
            input: "$inventory",
            as: "item",
            cond: {$eq: ["$$item.size",  inputSize]}
          }
        }
      }
    }
  },
  {$addFields: {
      innerObj: {
        $filter: {
          input: "$replace.used",
          as: "item",
          cond: {$eq: ["$$item.date", inputDate]}
        }
      },
      innerOthers: {
        $filter: {
          input: "$replace.used",
          as: "item",
          cond: {$ne: ["$$item.date", inputDate]}
        }
      },
      replace: "$$REMOVE"
    }
  },
  {$set: {
      innerObj: {
        $cond: [
          {$gt: [{$size: "$innerObj"}, 0]},
          {$first: "$innerObj"}, 
          {count: "0",  date: inputDate}
        ]
      }
    }
  },
  {$set: {"innerObj.count": {$toString: {$add: [{$toInt: "$innerObj.count"}, 1]}}}},
  {$set: {
      newObj: {$concatArrays: ["$innerOthers", ["$innerObj"]]},
      innerObj: "$$REMOVE",
      innerOthers: "$$REMOVE"
    }
  },
  {
    $set: {
      inventory: {
        $map: {
          input: "$inventory",
          as: "item",
          in: {
            $mergeObjects: [
              "$$item",
              {$cond: [
                  {$eq: ["$$item.size", inputSize]},
                  {used: "$newObj"},
                  {used: "$$item.used"}
                ]}
            ]
          }
        }
      },
      newObj: "$$REMOVE"
    }
  }
])

看看它在操場上的例子是如何工作的

暫無
暫無

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

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