我想知道如何进行查询,其中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
}]
}
答案 0 :(得分:1)
使用现有查询,您的查询的customers.email
和customers._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
}
});
);