javascript - Mongoose - 从子文档中删除属性

标签 javascript node.js mongodb mongoose subdocument

我有以下 Mongoose 模式和代码:

架构:

{
    ...
    inv: {
        type: Object,
        default: {}
    },
    ...
}

代码(版本 1),其中 targetData 是一个 Mongoose Documentitem 是一个 String,并且数量 是一个数字:

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 关键字完美配合。

最佳答案

找出问题所在。我所需要做的就是使用 targetData.markModified("inv") 手动告诉 Mongoose inv 已被修改。 Docs .这是因为 SchemaType 是 Mixed (Object)

关于javascript - Mongoose - 从子文档中删除属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53972854/

相关文章:

java - 为什么Javascript没有线程?

javascript - 将 Div 类附加到超链接类——然后在单击时克隆超链接并将其附加到容器

javascript - 如何从 Node.js 主模块访问全局变量?

javascript - 为什么这个尾递归循环会导致javascript/node中的栈溢出?

node.js - 如何在 Mongoose 中定义排序函数

mongodb - Play框架中Mongo Scala Driver和Reactive-Mongo Driver有什么区别?

javascript - 语法错误 - typescript - 意外标记 :?

node.js - 使用 typings 与 npm 安装类型定义文件有什么区别?

python - 如何访问查询的字段

mongodb - node.js: 带有 Mongoose 的 expressjs