1

CouchDB のビューに map 関数があり、タイプが のドキュメントに対して一意ではない 2 つの配列キーを発行しますmessage

2 つの配列キー

配列キーの最初の位置は user_id で、2 番目の位置はユーザーがメッセージを読んだかどうかを表します。

include_docs=trueこれは、実際のドキュメントを設定および取得できるという点でうまく機能します。ただし、上記のビューの結果でわかるように、その場合は重複したドキュメントを取得しています。特定のユーザーが読んだ一意のメッセージを返すようにクエリできるビューを作成できる必要があります。さらに、結果セットを効率的にページ付けできる必要があります。

  1. 上の画像で、ドキュメント ID 26a9a271de3aac494d37b17334aaf7f3に対して [66, true] が 2 回出力されていることに注意してください。私が知る限り、マップ関数のキーでは、一意のドキュメントが返されるような方法で縮小することはできません。

  2. 私が持っていた次のアイデアはdoc._id、マップ関数でも発行しgroup_level=exact、結果を減らすことでした:

    3つの配列キー

    一意のドキュメント ID を取得できるようになりましたが、2 番目のクエリを実行しないとドキュメントを取得できません。また、2 番目のクエリの場合でも、このようなページネーションを行うにはかなりの複雑さが必要になります (少なくとも私はそう思います)。

  3. 私が思いついた最後のアイデアは、配列キーの 3 番目の位置にある doc._id ではなく、ドキュメント全体を出力することです。そうすれば、ドキュメント全体にアクセスして、おそらくページ付けできます。これは本当に野蛮に思えます。

だから私の質問は:

上記の#3はひどい考えですか?足りないものはありますか?より良いアプローチはありますか?

前もって感謝します。

4

1 に答える 1

0

質問に対する@WickedGreyのコメントを参照してください。解決策は、1 つのドキュメントに対して同じキーを 2 回発行しないようにすることです。キーを配列に出力するときにキーを追跡し、キーが配列に存在する場合は出力をスキップすることで、マップ関数でこれを行います。

于 2012-07-16T20:06:10.640 に答える