Node.js Mongoose选择数组中的$ne

Node.js Mongoose选择数组中的$ne,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想知道如何查询数组的位置。_id!='某物' 下面是一个我为什么需要这样做的例子。用户希望更新其帐户电子邮件地址。我需要这些是唯一的,因为他们使用这个登录。当他们更新帐户时,我需要确保新的电子邮件不存在于其他帐户上,但如果他们的帐户上已经存在,则不要给出错误信息(他们没有更改电子邮件,只是他们个人资料中的其他内容) 下面是我尝试使用的代码。它不会给出任何错误,但它总是返回0的计数,因此即使应该也不会创建错误 Schemas.Client.count({ _id: client._id, 'cu

我想知道如何查询数组的位置。_id!='某物'

下面是一个我为什么需要这样做的例子。用户希望更新其帐户电子邮件地址。我需要这些是唯一的,因为他们使用这个登录。当他们更新帐户时,我需要确保新的电子邮件不存在于其他帐户上,但如果他们的帐户上已经存在,则不要给出错误信息(他们没有更改电子邮件,只是他们个人资料中的其他内容)

下面是我尝试使用的代码。它不会给出任何错误,但它总是返回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
  }]
}

我可以使用聚合来实现这一点

为什么它没有按我的方式工作:当查找$ne:customerID时,它将永远不会返回结果,因为该_id确实存在。它无法将客户、电子邮件和客户结合起来。\u我希望它能这样做

下面是它的外观:

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
      }
    });
);

在现有查询中,
customers.email
customers.\u id
部分查询将作为一个组对
customers
的所有元素进行评估,因此它不会匹配具有
customerID
的任何元素的文档,无论其
email
。但是,您可以使用更改此行为,以便两个部分一次在每个元素上串联操作:

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
  }
});

这比我想到的要干净得多,我会把它作为答案。谢谢