gpt4 book ai didi

node.js - Mongoose/MongoDB 更新不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 00:51:01 25 4
gpt4 key购买 nike

我知道这个问题在这里已经被打败了,但我已经尝试了一切,但无法解决这个问题。这让我发疯。

我有一个如下所示的模型:

customer {
email: String,
password: String,
addresses: [addresses_schema]
}

地址架构看起来像

address {
addr1: String,
... Other address fields
primary_address: Boolean
}

现在,我想更新用户的特定地址记录,使其 Primary_address 为 true。

所以我这样做:

var modifyUser = function(address_id){
User.findOne( { email: email } ).then(function(user){
user.update({ 'addresses._id': address_id },
{ $set: { 'addresses.$.primary_address': 'true' } } )

.then(function(){
console.log('Should eventually reach here');
}).catch (err) {
console.log('err:', err.message);
});


user.save();
});
}

但是,如果我在更新之前和之后获取 user.addresses,则根本没有任何变化。相反,它给了我错误:

cannot use the part (addresses of addresses._id) to traverse the element ({addresses[ {addr1: '123 test street', addr2: '', city: 'test city' ... ]}

有人可以帮助我吗?我真的很感激。谢谢!

最佳答案

我的钱是你正在查找的“address_id”值实际上与任何内容都不匹配。无论如何,对检索到的文档执行 .update() 通常都不是您想要的,这会混淆代码中的问题。

而是执行.findOneAndUpdate()最初通过匹配的“email”和“addresses._id”值进行检索,如以下完整示例所示:

const mongoose = require('mongoose')
const Schema = mongoose.Schema;

var addressSchema = new Schema({
name: String,
primary: { type: Boolean, default: false }
});
var userSchema = new Schema({
email: String,
addresses: [addressSchema]
});
var User = mongoose.model('User',userSchema);

mongoose.connect('mongodb://localhost/utest');
mongoose.set("debug",true);

await User.remove();

let user = await User.create({
email: "example@example.com",
addresses: [
{ "name": "One" },
{ "name": "Two" }
]
});
console.log("1️⃣", user);

user = User.findOneAndUpdate(
{
"email": user.email,
"addresses._id": user.addresses[1]._id
},
{
"$set": { "addresses.$.primary": true }
},
{ "new": true }
)
console.log("2️⃣", user);

mongoose.disconnect();

这将始终产生如下输出:

1️⃣ { __v: 0,
email: 'example@example.com',
_id: 55ecf31a53558e183d208aa2,
addresses:
[ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
{ name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: false } ] }
2️⃣ { _id: 55ecf31a53558e183d208aa2,
email: 'example@example.com',
__v: 0,
addresses:
[ { name: 'One', _id: 55ecf31a53558e183d208aa4, primary: false },
{ name: 'Two', _id: 55ecf31a53558e183d208aa3, primary: true } ] }

并具有如下调试输出:

Mongoose: users.remove({}) {}
Mongoose: users.insert({ email: 'example@example.com', _id: ObjectId("55ecf35627cddb243d3d8e22"), addresses: [ { name: 'One', _id: ObjectId("55ecf35627cddb243d3d8e24"), primary: false }, { name: 'Two', _id: ObjectId("55ecf35627cddb243d3d8e23"), primary: false } ], __v: 0 })
Mongoose: users.findAndModify({ 'addresses._id': ObjectId("55ecf35627cddb243d3d8e23"), email: 'example@example.com' }) [] { '$set': { 'addresses.$.primary': true } } { new: true, upsert: false, remove: false }

这只是设置示例,但主要事情发生在 .findOneAndUpdate() 中,在 promise 的解析中,您会看到返回的文档从指定数组元素处的原始表单“更新”。

这基本上就是您应该在这里做的事情,对返回文档的任何进一步修改都在初始“更新和获取”完成之后进行。

关于node.js - Mongoose/MongoDB 更新不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com