我正在尝试在Node.js API中更新MongoDB模式中的特定字段。
具体来说,该功能可以接受用户(接受者)的朋友请求。 friend 将存储在 friends 数组中,并且当用户( accepter )接受请求时, friends 数组中 friend 的状态将从“待处理”更改为“已接受”
从其他类似的帖子中,我了解到$ set运算符允许我在 friends 数组中进行查找和编辑,但是数据库不会更新为“ accepted”。到目前为止,似乎没有一种解决方案有效。
其他信息:
任何帮助将不胜感激!我对此是全新的!
以下是函数:
User.findById(accepterID)
.then(accepter => {
accepter.update(
{ "friends.friendID" : requesterID },
{ $set: { "friends.$.status" : "accepted" }},
)
res.json(accepter)
})
}
以下是架构:
const UserSchema = new Schema({
method: {
type: String,
enum: ['local', 'google', 'facebook'],
required: true
},
friends: [
{
status: {
type: String,
enum: ['requested', 'pending', 'accepted']
},
addedWhen: {
type: Date
},
friendID: {
type: Schema.Types.ObjectId,
ref: 'users'
}
}
],
local: {
firstName: {
type: String
},
lastName: {
type: String
},
email: {
type: String,
lowercase: true
},
password: {
type: String,
},
date: {
type: Date,
default: Date.now
}
},
});
答案 0 :(得分:0)
尝试使用这样的update
会给我一个过时的警告(似乎update
是集合update
的别名),然后崩溃,因为“不能使用部分( friends.status)来遍历元素” 。不确定为什么会这样。
所以您的HTTP客户端挂起是因为您无法正确处理错误? (无论如何,res.json
本身不会失败。)
独立于您的HTTP调试,我的更新工作如下:
User.findById(accepterID).then(accepter => {
// updateOne works as well, but no way it gives the fresh doc
User.findOneAndUpdate(
{ _id: accepterID, 'friends.friendID': requesterID },
{ $set: { friends.$.status: 'accepted' } },
{ new: true },
(err, freshAccepter) => {
if (err) throw err;
res.json(freshAccepter);
}
);
});
或更短,因为您不需要原始接受者,所以不需要包装findById
。