Node.js 在mongoose中只返回数组的一项?
我试图获取一个数组元素并更新它的一组属性。以下是我目前做这件事的方式,这对我来说是错误的。这可以在不必通过数组循环以匹配_id的情况下完成吗?是否可以通过_id仅选择一个要更新的数组元素Node.js 在mongoose中只返回数组的一项?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图获取一个数组元素并更新它的一组属性。以下是我目前做这件事的方式,这对我来说是错误的。这可以在不必通过数组循环以匹配_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
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');
});
Schemas.Users.findOne({u-id:req.session.userID})
.select('friends').exec(函数(err,user){
if(err)返回next(err);
//找出我应该更新的朋友
var指数=零;
for(var i=0;i
是的,Mongoose有一种专门为您的案例设计的方法:
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');
});
如果您唯一的目标是设置用户的朋友的名字,那么您可以考虑使用而不是<代码> FIDON/<代码>和<代码>保存< /代码>:
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');
});
更新
速度更快,但Mongoose设置器
、验证器
和中间件
无法使用它。这取决于模式的定义方式,以及您是将“朋友”分离到另一个模型中,还是将其“嵌入”。这些信息不在你的问题中。抱歉,朋友们不在单独的模型中。使用top方法似乎是最好的,但当它保存时,它会清除阵列的其余部分,只留下我正在更新的一个。我正在更新该数组中的大约20个元素,所以更新可能不是最好的选择。我认为它不喜欢只从数组中选择一个元素,然后保存-丢失所有其他数组元素的想法。@codephobia是的,我错过了它。用更好的方法更新了ny答案。应该是user.friends.id(req.params.friendsid)?是的,修复了它。对不起:)