0

私はcouchbaseを初めて使用し、Androidアプリケーションの1つにcouchbase liteを実装しようとしています。私が特に苦労しているのは、ドキュメントに記載されているビューの概念とマップ機能のルールです。

データベースでは、アプリはさまざまなドキュメント タイプのドキュメントを保存します。1 つのクエリで、ドキュメントの種類 (「支払い」) とドキュメントの属性の値 (doc["approved"] = true) によってドキュメント全体を取得する必要があります。

したがって、次のようなビューを作成します。

   com.couchbase.lite.View view = database.getView("payments");
    if (view.getMap() == null) {
        Mapper map = new Mapper() {
            @Override
            public void map(Map<String, Object> doc, Emitter emitter) {
                if (doc.get("type").equals("payments") && doc.get("approved") == true) {
                    emitter.emit(doc.get("name"), doc); 
                }
            }
        };
        view.setMap(map, "1");
    }

doc["approved"] 値は、時間の経過とともに更新される可能性があることに注意してください。ドキュメント内のマップ関数に関するルールの 1 つで、次のように述べられています。

それは「純粋な」関数でなければなりません: ... つまり、同じ入力で呼び出されるたびに、まったく同じ出力を生成する必要があります。

上記のマップ関数の実装はその規則に違反しますか? ドキュメントでは、さらに次のように述べています。

特に、次のよくある間違いを避けてください。 ... map 関数がいつ呼び出されるかについて、何も仮定しないでください。これは、インデクサーの実装の詳細です。(たとえば、ドキュメントが変更されるたびに呼び出されるわけではありません)。

ドキュメントの 1 つの承認済みステータスが false から true に更新された場合、次のクエリには必ずしも更新されたドキュメントが含まれていないということですか? もしそうなら、これを達成するために何をする必要がありますか? それが正確に何を意味するのか、私はかなり確信が持てませんか?誰か私の目を開けてみてください。

4

1 に答える 1

1

「純粋」とは、マップ関数で外部状態を使用できないことを意味します。すべての決定は、渡されたパラメータのみに基づいている必要があります。あなたのマップ機能はこれに違反していません。

あなたの理解に欠けている部分は、ストレージとインデックス作成の違いだと思います。ドキュメントのリビジョンをデータベースに保存できますよね? それ自体では、ビューのインデックスが更新されることはありません。これが、「ドキュメントが変更されるたびに呼び出されるわけではない」というドキュメントの意味です。デフォルトでは、次のクエリが実行されるとインデックスが更新されるため、ドキュメントの最新の状態が出力されます。最後のクエリが実行されてから、実際には何度も変更されている可能性があります。

于 2015-06-22T22:59:36.767 に答える