具有多个或多个参数的复杂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

我正在使用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

不幸的是,它没有像我希望的那样工作,主要是针对
语句。我想要的是第3行和第4行的两个
是独立的

这意味着字段
范围
(第3行)必须包含字符串
资源
或存储在event.resource中的字符串,同时字段
设备id
必须为空或包含id
event.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要使两个
$或
操作分开,必须将它们放入
$和
运算符中。请参阅更新的答案。非常感谢。我会听从你的详细建议,让你知道事情的结局。