[英]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 });
}
});
提前感謝您的幫助
你可以這樣做:
inventory
項目並將其稱為replace
replace
為兩部分innerObj
(帶有要編輯的日期的 obj)和innerOthers
- 數組的其余部分innerObj
。innerObj
的計數增加 1。innerOthers
和innerObj
合並回newObj
。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.