Mongoose - 从子文档中删除属性
Posted
技术标签:
【中文标题】Mongoose - 从子文档中删除属性【英文标题】:Mongoose - Delete property from SubDocument 【发布时间】:2019-05-27 02:59:23 【问题描述】:我有以下 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 有趣,这行得通。您能否解释为什么这有效,而不是我在答案中的其他尝试?谢谢!
你用的是哪个版本的猫鼬?
【参考方案1】:
找出问题所在。我需要做的就是手动告诉 Mongoose inv
已被修改,使用 targetData.markModified("inv")
。 Docs。这是因为 SchemaType 是 Mixed (Object
)
【讨论】:
【参考方案2】:我知道你解决了这个问题,但我有一个想法。 通常在这种情况下,我想获取文档并遍历对象并找到该项目并将其删除并再次保存文档。这是我正在做的一种天真的方式。
【讨论】:
不确定你的意思。你有例子吗?以上是关于Mongoose - 从子文档中删除属性的主要内容,如果未能解决你的问题,请参考以下文章