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残念ながら、主にステートメントの場合、それは私が望むようには機能しません。私が欲しいのは、or3行目と4行目の2つが独立していることです。

つまり、フィールドscopes(行3)には文字列resourcesまたはevent.resourceに格納されている文字列が含まれているdevice_ids必要がありますが、フィールドは空であるかIDが含まれている必要がありますevent.body.id

私が準備したテストから、orコマンドがすべてまとめられていることがわかります。これは、4つまたは条件の1つだけが満たされたときに、ドキュメントを取得することを意味します。

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

私が到達できないのは、フィールドscopesに関連する条件とフィールドに関連する条件の両方device_idsを満たすことができるように、それらを2つのグループに分割することです。

問題がよく説明されていることを願っています。ありがとう。

4

1 に答える 1

8

$whereパフォーマンスがひどいので絶対に必要な場合を除いて使用しないでください。代わりに、$orと演算子の組み合わせを使用してください。$size

UPDATE 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 に答える