![](/img/trans.png)
[英]How to get the connected objects within a collection in an array in Mongoose MongoDb NodeJS
[英]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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.