0

couchdb の複雑なクエリ処理に何か問題があります。

次のような6つのパラメーターで構成される複雑なキーを発行するマップ関数があります。

emit([doc.profileId,  doc.beamId, doc.name, doc.beambeanchId, "true", attachName], {beamdocId:doc._id, attachName:attachName})

私のクエリパラメータ(coffescript)は次のようになります:

params =
startkey:[ profileId, beamId, namePrefix, beambeanchId, hasAttach, attachNamePrefix]
endkey:[
  profileId or "\ufff0",
  beamId or "\ufff0",
  namePrefixEnd or "\ufff0",
  beambeanchId or "\ufff0",
  hasAttachEnd,
  attachNamePrefixEnd or "\ufff0"]

問題は、最初の 2 つだけが適切に機能し、残りはまったくフィルタリングされていないことです。たとえば、namePrefixEnd を null 以外の値に設定しても、結果は減少しません。

オブジェクトと配列として発行されたキーでそれを試しました。同じ話、最初の2つだけが機能しています。3 番目は無視されます。namePrefixEnd を使用してインスタンス beamId の順序を変更しても、最初の 2 つだけが正しく機能しています。

何が問題なのですか?couchdb 複合キーのパラメーター数に制限はありますか?

データと db.view 関数にアクセスするために nano ライブラリを使用しています。

4

1 に答える 1

0

Ok。私は自分で答えを見つけました。一般に、startkey/endkey のキーの構造は、発行されたキーと正確に一致する必要があります。

私のケースを解決するには、後で検索するフィールドの可能なすべての組み合わせを発行する必要があります。

例えば:

emit([doc.profileId,  doc.beamId, doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.name, doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId,  doc.beambeanchId, "true", attachName],
     {beamdocId:doc._id, attachName:attachName})
emit([doc.profileId, attachName],
     {beamdocId:doc._id, attachName:attachName})

などなど。必要なものを見つけることができます。もちろん、それを防弾にするためには、配列の代わりにオブジェクト キーを使用する方がよいでしょう。そうしないと、値が混同される可能性があります。

于 2013-08-19T18:22:47.710 に答える