我试图抓住一个数组元素并更新它的一堆属性。这就是我目前正在做的事情,这对我来说是错误的。这可以在不必循环遍历数组以匹配_id的情况下完成吗?您可以通过_id选择其中一个数组元素进行更新吗?
Schemas.Users.findOne({ _id: req.session.userID })
.select('friends').exec(function(err, user){
if (err) return next(err);
// figure out which friend I should be updating
var index = null;
for (var i = 0; i < user.friends.length; i++) {
if (user.friends[i]._id == req.params.friendID) {
index = i;
break;
}
}
// if we didn't find the friend, something went wrong
if (index === null) {
console.log('Error: index not found.');
return res.redirect('somepage');
}
// update friend
user.friends[index].name = req.body.name;
user.markModified('friends');
user.save();
return res.redirect('somepage');
});
答案 0 :(得分:1)
是的,Mongoose专门针对您的情况设计了id方法:
Schemas.Users.findOne({
_id: req.session.userID,
}).select('friends').exec(function(err, user){
if (err) return next(err);
var friend = user.friends.id(req.params.friendID);
// if we didn't find the friend, something went wrong
if (friend === null) {
console.log('Error: index not found.');
return res.redirect('somepage');
}
// update friend
friend.name = req.body.name;
user.save();
return res.redirect('somepage');
});
如果您的唯一目标是设置用户朋友的名称,那么您可以考虑使用update代替findOne
和save
:
Schemas.Users.update({
_id: req.session.userID,
friends: {$elemMatch: {
_id: req.params.friendID
}}
}, {
'friends.$.name': req.params.friendID
}).exec(function(err, numberAffected){
if (err) return next(err);
// if we didn't find the friend, something went wrong
if (numberAffected === 0) {
console.log('Error: index not found.');
return res.redirect('somepage');
}
return res.redirect('somepage');
});
Update
速度更快,但是Mongoose setters
,validators
和middlewares
无效。