多条件 OR 的复杂 MongoDB 查询

3
我正在使用MongoDB,并且我已经构建好了以下查询。
1 AccessToken.where('resource_owner_id').equals(event.resource_owner_id)
2           .where('revoked_at').equals(undefined)
3           .or([ { scopes: /resources/i }, { scopes: new RegExp(event.resource,'i') } ])
4           .or([ { device_ids: [] }, { device_ids: event.body.id } ])

对于这个例子,我使用Mongoose和coffescript。
不幸的是,它并不像我想象的那样工作,主要问题在于or语句。我想要的是第3行和第4行的两个or是独立的。
这意味着字段scopes(第3行)必须包含字符串resources或存储在event.resource中的字符串,同时字段device_ids必须为空或包含event.body.id的id。
从我准备的测试中,我可以看到or命令把所有条件放在一起。这意味着只要满足四个or条件中的一个,我就会得到文档。
- { scopes: /resources/i }
- { scopes: new RegExp(event.resource,'i') }
- { device_ids: [] }
- { device_ids: event.body.id }

我无法将它们分为两组,以便同时满足与字段scopes相关的条件和与字段device_ids相关的条件。希望问题已经描述清楚。谢谢。
1个回答

8
除非必须使用,否则请勿使用$where,因为性能很差。相反,请使用$or$size的组合操作符来进行替代: 更新:没有Mongoose的and方法,所以必须直接使用$and操作符。
AccessToken.find({
    resource_owner_id: event.resource_owner_id,
    revoked_at: undefined,
    $and: [
        { $or: [{ scopes: /resources/i }, { scopes: new RegExp(event.resource,'i') }] },
        { $or: [{ device_ids: { $size: 0 } }, { device_ids: event.body.id }] }
    ]
}, callback);

这与我想出的解决方案类似。我更新了问题,因为它更加复杂。问题是,我希望以一种方式对or进行分组,以便满足作用域的一个条件和设备ID的一个条件。 - Andrea Reginato
为了将两个 $or 操作分开,您需要将它们放入一个 $and 操作符中。请参见更新的回答。 - JohnnyHK
非常感谢。我将遵循您的详细建议,并让您知道事情最终如何结束。 - Andrea Reginato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接