具有多个或多个参数的复杂MongoDB查询
我正在使用mongodb,我构建了以下查询具有多个或多个参数的复杂MongoDB查询,mongodb,Mongodb,我正在使用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 .o
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
不幸的是,它没有像我希望的那样工作,主要是针对或
语句。我想要的是第3行和第4行的两个或是独立的
这意味着字段范围
(第3行)必须包含字符串资源
或存储在event.resource中的字符串,同时字段设备id
必须为空或包含idevent.body.id
从我准备的测试中可以看出,或
命令将所有这些放在了一起。这意味着,当四个or条件中只有一个满足时,我就得到了文档
- { scopes: /resources/i }
- { scopes: new RegExp(event.resource,'i') }
- { device_ids: [] }
- { device_ids: event.body.id }
我无法达到的是将它们分为两组,以便满足与字段范围相关的条件和与字段设备ID相关的条件
希望问题描述得很好。
谢谢。不要使用$where
,除非您必须使用,因为性能很差。改为使用and运算符的组合:
更新没有Mongoose和
方法,因此您必须直接使用操作符
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的一个条件。@AndreaReginato要使两个$或操作分开,必须将它们放入$和运算符中。请参阅更新的答案。非常感谢。我会听从你的详细建议,让你知道事情的结局。