我正在使用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
必须为空或包含id event.body.id
。
从我准备的测试中,我可以看到or
命令放在一起。这意味着当满足四个条件中的一个或条件时,我会得到该文档。
- { scopes: /resources/i }
- { scopes: new RegExp(event.resource,'i') }
- { device_ids: [] }
- { device_ids: event.body.id }
我无法达到的目的是将它们分成两组,以便可以满足与字段scopes
相关的条件和与字段device_ids
相关的条件。
希望问题得到很好的描述。 感谢。
答案 0 :(得分: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);