繁体   English   中英

Mongoose - 如何更新 MongoDB 中数组中的所有对象?

[英]Mongoose - How to update all objects within an array in MongoDB?

我正在创建一个应用程序,我想在其中切换一个人的默认地址。
我的用户架构包含一个字段,它是一个作为对象的交付地址数组。
其中一个字段是isDefault ,这是我想要从 true 切换到 false 的 defaultAddress 字段,反之亦然。
具体来说,如果用户更改了他们的默认地址,我想将其余地址设置为 false 并更新他/她选择的地址为 true

用户架构

const UserSchema = Schema({
 email: {
    type: String,
    required: true,
  },
 deliveryAddresses: [deliverySchema]

送货地址架构

{
      id: {
        type: Schema.Types.ObjectId,
        required: true
      },
      isDefault: {
        type: Boolean,
        required: true,
        default: false,
      },
      name: {
        type: String,
      },
      email: {
        type: String,
      },
      phone: {
        type: String,
      },
     
    }

为此,我到目前为止所做的是:
获取用户的电子邮件。
从将切换为 true 的用户那里获取送货地址的 ID。

exports.setDefault = (req, res, next) => {
  const email = req.body.email;
  const id = req.body.id;

  User.findOne({ email: email })
    .then((user) => {
      let addresses = [...user.deliveryAddresses];

      addresses.forEach((address) => {
        address.isDefault = false;
      });
    
      const index = addresses.findIndex((address)=> {
          return address.id.toString() === id.toString();
      });

      addresses[index].isDefault = true;
  
      user.deliveryAddresses = addresses;
      return user.save();  
    })
    .then((doc) => {
      res.status(200).json({
        user: doc,
        statusCode: "200",
        msg: "Address updated successfully",
      });
    })

    .catch((err) => {
      res.status(500).json({
        statusCode: 500,
        error: err,
        msg: "Something went wrong",
      });
    });
};

但是,在完成所有这些之后,在邮递员上测试我的 api 时,它似乎可以工作,没有错误。 但是在检查数据库时,没有任何变化。
我不知道我做错了什么。

猫鼬很奇怪。 您需要将deliveryAddresses子对象标记为已修改,否则将不会保存其更改。

user.markModified('deliveryAddresses');
user.save();

来自猫鼬常见问题解答

“Mongoose 不会为数组索引创建 getter/setter;没有它们,mongoose 永远不会收到更改通知,因此不知道保留新值。有两种解决方法:MongooseArray#set 或 Document#markModified()。”

你能试试吗

user.markModified('deliveryAddresses');
user.save();

更多关于https://mongoosejs.com/docs/faq.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM