我正在使用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.
希望问题得到很好的描述.谢谢.
不要使用$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)
| 归档时间: |
|
| 查看次数: |
5350 次 |
| 最近记录: |