簡體   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