【发布时间】:2025-12-25 01:20:08
【问题描述】:
我有以下 Mongoose 架构和代码:
架构:
{
...
inv: {
type: Object,
default: {}
},
...
}
代码(版本 1),其中 targetData 是 Mongoose Document,item 是 String,amount 是 Number:
targetData.inv[item] = targetData.inv[item] - amount;
if (!targetData.inv[item]) delete targetData.inv[item];
await targetData.save();
代码(第 2 版):
targetData.inv[item] = targetData.inv[item] - amount;
if (!targetData.inv[item]) targetData.inv[item] = undefined;
await targetData.save();
问题是这些尝试都没有从文档中删除targetData.inv[item]。我的目标是从子文档中删除一个项目,比如"thing"。例如:
之前:
{
...
inv: {
thing: 5
},
...
}
之后:
{
...
inv: {},
...
}
注意:当amount 是小于5 的数字时(在上面的示例中),代码可以正常工作。如果我要删除所有5,那么它不会更新,它将保持为5。
注意 2:我使用的是 Mongoose 5.3.15
我怎样才能做到这一点?
编辑: 看起来只有在 inv 只有 1 个属性时才会发生这种情况。 inv: { thing: 5, anotherThing: 6 } 之类的内容与 delete 关键字完美搭配。
【问题讨论】:
-
移除属性的实际条件是什么?是不是当一个值小于等于
0然后删除? -
@chridam 特别是
0,是的 -
您是否尝试过使用
set()方法:if (targetData.inv[item] === 0) targetData.set(`inv.${item}`, undefined, {strict: false} );? -
@chridam 有趣,这行得通。您能否解释为什么这有效,而不是我在答案中的其他尝试?谢谢!
-
你用的是哪个版本的猫鼬?
标签: javascript node.js mongodb mongoose subdocument