3

我正在使用 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声明。我想要的是or第 3 行和第 4 行的两个是独立的。

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

从我准备的测试中,我可以看到该or命令将所有内容放在一起。这意味着当仅满足四个 or 条件之一时,我将获得该文档。

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

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

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

4

1 回答 1

8

$where除非绝对必须,否则不要使用,因为性能很糟糕。$or请改用and运算符的组合$size

更新没有 Mongooseand方法,因此您必须$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);
于 2012-11-07T23:38:04.313 回答