1

データベースに CouchDB を使用するアプリケーションを作成しています。このアプリケーションは、Couchdb を説明するためによく使用されるブログの例と同様の性質を持っています。ブログのコメントのように、特定の投稿を参照する他のドキュメントを持つ投稿のような「アンカー」ドキュメントがあります。(各「コメント」には、SQL 外部キーのようなフィールドがあります。「投稿」の一意の ID が含まれています)

ただし、「コメント」ドキュメントにはさまざまな種類があり、そのうちの 1 つによって、ブログ投稿がアプリケーションに関連しなくなります。(ブログの「投稿」は治療の記録であり、私が参照している「コメント」タイプは治療が終了したことを示すレポートです).

これらの処理済みドキュメント (「コメント」など) のいずれも添付されていないすべての「投稿」のリストを出力するビューを作成する方法を考え出そうとしています。誰でもこれで私を助けることができますか?

このドキュメントを更新する複数のモバイル クライアントが存在するため、メインの「投稿」ドキュメントに「アクティブ」フィールドを設定することはできません。2 つのクライアントがアンカー ドキュメントを変更する前に、リビジョンの競合を回避したいと考えています。ネットワークカバレッジに戻ります。

4

2 に答える 2

0

あるDBに投稿があり、別のDBにコメントがある場合、「結合」を実行しようとし、couchdbに結合ないため、この問題はcouchdbでは解決できません。この場合、サーバークライアントで作業して、両方のDBに個別にクエリを実行し、コメントが許可されている投稿のみを表示する必要があります。

そうでなければ、すべてが1つのDBにある場合は、コメントを投稿内に埋め込む必要があります。その後、有効なコメントを含む投稿のみを出力するビューを作成するのは簡単です。

于 2013-01-21T18:44:28.360 に答える
0

You can use aggregation to count the comments in post with map and reduce and filter out the post with more then 0 comments with list function exactly like in this answer to question "CouchDB equivalent of Sql NOT IN?".

View "count_comments":

map: function(doc) {
  if (!doc.type) return;
  if (doc.type == "post") emit(doc._id, null);
  if (doc.type == "comment" && doc.post) emit(doc.post, null);
}

reduce: _count

List:

no_comments: function(head, req) {
  var row;
  while (row = getRow()) {
    if (row.value == 1)
      send(row.key + "\n");
  }
}

Query:

http://127.0.0.1:5984/mydb/_design/post_n_comments/_list/no_comments/count_comments?group_level=1
于 2013-01-21T23:56:13.447 に答える