Node.js 在mongoose中只返回数组的一项?

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

我试图获取一个数组元素并更新它的一组属性。以下是我目前做这件事的方式,这对我来说是错误的。这可以在不必通过数组循环以匹配_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');
});
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)?是的,修复了它。对不起:)