Mongoose在数组中选择$ ne

时间:2014-07-18 20:27:59

标签: node.js mongodb mongoose

我想知道如何进行查询,其中array._id!='someid'。

以下是我需要这样做的原因示例。用户想要更新其帐户电子邮件地址。我需要这些是唯一的,因为他们使用它来登录。当他们更新帐户时,我需要确保新电子邮件在其他帐户中不存在,但如果帐户中已存在该电子邮件,则不会出现错误(他们没有更改他们的电子邮件,只是他们的个人资料中的其他内容)。

以下是我尝试使用的代码。它不会给出任何错误,但它总是返回0,因此即使它应该也不会创建错误。

Schemas.Client.count({ _id: client._id, 'customers.email': email, 'customers._id': { $ne: customerID } }, function (err, count) {
  if (err) { return next(err); }
  if (count) {
    // it exists
  }
});

我猜它应该使用$ ne或$ not,但我找不到任何有关ObjectId的在线示例。

客户数据示例:

{
  _id: ObjectId,
  customers: [{
    _id: ObjectId,
    email: String
  }]
}

2 个答案:

答案 0 :(得分:1)

使用现有查询,您的查询的customers.emailcustomers._id部分将作为一个群组对customers的所有元素进行评估,因此它不会与某个文档相匹配任何带有customerID元素,无论其email如何。但是,您可以使用$elemMatch来更改此行为,以便这两个部分一次对每个元素进行串联操作:

Schemas.Client.count({ 
  _id: client._id,
  customers: { $elemMatch: { email: email, _id: { $ne: customerID } } }
}, function (err, count) {
  if (err) { return next(err); }
  if (count) {
    // it exists
  }
});

答案 1 :(得分:0)

我能够使用聚合做到这一点。

为什么这不能按我的方式工作:在寻找$ ne:customerID时,它永远不会返回结果,因为_id确实存在。它无法以我想要的方式组合cutomers.email和customers._id。

以下是它的外观:

Schemas.Client.aggregate([
    { $match: { _id: client._id } },
    { $unwind: '$customers' },
    { $match: {
      'customers._id': { $ne: customerID },
      'customers.email': req.body.email
    }},
    { $group: {
      _id: '$_id',
      customers: { $push: '$customers' }
    }}
    ], function (err, results) {
      if (err) { return next(err); }
      if (results.length && results[0].customers && results[0].customers.length) {
        // exists
      }
    });
);