CouchDB のビューに map 関数があり、タイプが のドキュメントに対して一意ではない 2 つの配列キーを発行しますmessage
。
配列キーの最初の位置は user_id で、2 番目の位置はユーザーがメッセージを読んだかどうかを表します。
include_docs=true
これは、実際のドキュメントを設定および取得できるという点でうまく機能します。ただし、上記のビューの結果でわかるように、その場合は重複したドキュメントを取得しています。特定のユーザーが読んだ一意のメッセージを返すようにクエリできるビューを作成できる必要があります。さらに、結果セットを効率的にページ付けできる必要があります。
上の画像で、ドキュメント ID 26a9a271de3aac494d37b17334aaf7f3に対して [66, true] が 2 回出力されていることに注意してください。私が知る限り、マップ関数のキーでは、一意のドキュメントが返されるような方法で縮小することはできません。
私が持っていた次のアイデアは
doc._id
、マップ関数でも発行しgroup_level=exact
、結果を減らすことでした:一意のドキュメント ID を取得できるようになりましたが、2 番目のクエリを実行しないとドキュメントを取得できません。また、2 番目のクエリの場合でも、このようなページネーションを行うにはかなりの複雑さが必要になります (少なくとも私はそう思います)。
私が思いついた最後のアイデアは、配列キーの 3 番目の位置にある doc._id ではなく、ドキュメント全体を出力することです。そうすれば、ドキュメント全体にアクセスして、おそらくページ付けできます。これは本当に野蛮に思えます。
だから私の質問は:
上記の#3はひどい考えですか?足りないものはありますか?より良いアプローチはありますか?
前もって感謝します。