首页 > 解决方案 > 使用 javascript 数组方法更新 mongoose 中的嵌套数组

问题描述

我在更新mixed type猫鼬模式中的字段时遇到问题。这不是最好的架构设置,但我有理由以这种方式设置它。现在我想执行javascript array-like 诸如push. 我想访问在嵌套数组中迭代的当前文档的索引,在tags 字段上。像这样:

猫鼬模式

let user = {
    name : String,
    email : String,
    tags : []
}

tags字段是在创建用户时动态生成的,在将用户插入数据库后我最终得到了这样的结果

tags : [ 
        [{obj1}, {obj2}, {obj3}, ...], 
        [...], 
        [...], 
        [...], 
        [...] 
    ]

我想要实现的 - 将新文档以“javascript方式”推送到嵌套数组

user.tags[0].forEach(obj, index){
    // Do some operations here with obj and index
    // I don't know how to update a nested array with the mongo $push operator that is why I am falling back to the `js array push` method

    let newObj = { foo: bar }
    user.tags[0].push(newObj)
    user.save()
}

用邮递员测试后,显示操作成功并返回一个插入的项目,但我观察到两个问题:

  1. 它对 db 不是持久的,但同时我对邮递员的回复看起来像这样:
{
    name : bar,
    email : foo,
    tags : [
        [{ foo : bar}], // from the last push operation I did
        [],
        [],
        []...
        ...
    ]
}
  1. 对任何数组索引(例如第 0 个索引)的后续push操作会替换当前对象而不是附加它: user.tags[0].push(obj)===> 这会替换第一个对象(当然在邮递员响应中而不是 db,因为它似乎不是持久的)

任何帮助如何实现这一点将不胜感激

我只是在学习这些东西,非常欢迎任何更好的方法来解决同样的问题,谢谢。:)

标签: javascriptarraysmongodbexpressmongoose

解决方案


我终于从这里找到了解决方案: Freecodecamp 论坛

我错过了这user.markModified("nameOfFieldToUpdate")条线。在user.save()解决问题之前添加此行之后。


推荐阅读