具有多个OR的复杂MongoDB查询

And*_*ato 3 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           .or([ { device_ids: [] }, { device_ids: event.body.id } ])
Run Code Online (Sandbox Code Playgroud)

对于这个例子,我使用的是Mongoose和coffescript.

不幸的是,它不能按我的意愿工作,主要是为了or声明.我想要的是or第3行和第4行中的两个是独立的.

这意味着字段scopes(第3行)必须包含resources存储在event.resource中的字符串或字符串,同时该字段device_ids必须为空或包含id event.body.id.

从我准备的测试中我可以看到or命令全部放在一起.这意味着当满足四个条件中的一个或条件时,我得到文档.

- { scopes: /resources/i }
- { scopes: new RegExp(event.resource,'i') }
- { device_ids: [] }
- { device_ids: event.body.id }
Run Code Online (Sandbox Code Playgroud)

我无法达到的目的是将它们分成两组,以便满足与该领域scopes相关的条件和与该领域相关的条件device_ids.

希望问题得到很好的描述.谢谢.

Joh*_*yHK 7

不要使用$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);
Run Code Online (Sandbox Code Playgroud)