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