只返回mongoose中的一个数组项?

时间:2014-03-31 11:32:39

标签: 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 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');
});

1 个答案:

答案 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代替findOnesave

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 settersvalidatorsmiddlewares无效。