【问题标题】:Update model, delete its array and populate new array using MongoDB Mongoose使用 MongoDB Mongoose 更新模型、删除其数组并填充新数组
【发布时间】:2020-02-24 18:52:59
【问题描述】:

我希望就以下性能方面的最佳方式征求意见。

例如,我有一个模型

person :{
  _id: "12312",
  name: "hello",
  phones: [
     { number : "123456" }
  ]
}

当我更新人物模型时,比如名称:“newname”,我还希望清除电话数组并用新数组填充它。

我正在考虑做一个 findById/findOne().deleteArray().populateArray() 链接。

在 Mongoose 中链接它的最佳途径是什么?

我认为删除数组是最快的,因为 id 是一个随机的字母数字,而不是一些递增的 long 值,所以不妨删除所有内容并重新创建数组

想法?

这是我在 Express/Mongoose 中的功能

exports.update = function(req, res) {
    Person.findByIdAndUpdate(req.params.person_id, person, { new: true, runValidators: true }, function(err, person) {
        if (err) res.send(err);
        res.json(person);
    });
};

【问题讨论】:

    标签: mongodb mongoose nosql


    【解决方案1】:

    您可以使用 findOneAndUpdate 将手机数组设置为空数组,如下所示:

    
    const newDoc = {
      name: "newname",
      phones: []
    }
    
    let doc = await Person.findOneAndUpdate({ name: newDoc.name }, newDoc, {
      new: true
    });
    
    console.log(doc);
    

    或者如果您想用新手机替换现有手机,您可以使用这样的对象:

    const newDoc = {
      name: "newname",
      phones: ["1","2"]
    }
    

    【讨论】:

    • 谢谢。这确实清楚了一件事。但是我可以链接这个,以便我想在清除后向电话属性添加一个新数组吗?
    • @chitgoks 是的,您可以用新手机替换现有手机,正如我在答案中更新的那样。
    • 谢谢。最后一件事。我修改了 json,因为我实际上忘记了包含 id(我的错)。我的目标是通过 id 查看它,然后替换整个文档。这会是 Person.findById(id).update(....) 吗?
    • @chitgoks 在 mongoose 中已经有一个辅助方法,findByIdAndUpdate。 mongoosejs.com/docs/api/…
    • 谢谢你,这就是我想要的。最后一个问题。抱歉,我不确定为什么我的代码说“在路径 '_id' 上执行更新会修改不可变字段 '_id'。我正在使用 findIdAndUpdate 所以它应该忽略更新 id 字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2020-04-18
    • 2018-04-26
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多