具有多个OR的复杂MongoDB查询

时间:2012-11-07 23:20:35

标签: 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 } ])

对于这个例子,我使用的是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相关的条件。

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

1 个答案:

答案 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);