1

次のようなメイン ドキュメント タイプとしての私の Couchdb データベース:

{
   "_id" : "doc1",
   "type" : "main_doc",
   "title" : "the first doc"
   ...
}

ユーザー情報を格納する別の種類のドキュメントがあります。ユーザーがドキュメントをお気に入りとしてタグ付けできるようにしたい。異なるユーザーは、同じまたは異なるドキュメントをお気に入りとして保存できます。私のアイデアは、お気に入りのドキュメントを紹介して、これを次のように追跡することでした。

{
   "_id" : "fav1",
   "type" : "favorite",
   "user_id" : "user1",
   "doc_id" : "doc1"
}

user_id をキーとしてビューを作成し、お気に入りのドキュメント ID のリストを取得するのは簡単です。例えば:

function(doc) {
   if (doc.type == "favorite") {
      emit(doc.user_id, doc.doc_id);
   }
 }

ただし、お気に入りのリストを表示して、ドキュメントの user_id、doc_id、およびタイトルを表示したいと考えています。したがって、次のように出力します。

{ "key" : "user1", "value" : ["doc1", "the first doc"] }
4

2 に答える 2

2

CouchDB 0.11 (最近リリースされたばかり) では、このinclude_docs=true機能を使用すると、ビュー行内の任意のドキュメントを検索できます。例えば:

function(doc) {
    if(doc.type == "favorite") {
        emit(doc.user_id, {_id: doc.doc_id});
    }
}

でビューをクエリするとinclude_docs=true、次のような JSON が表示されます。

// ... normal stuff
rows: [
  {
    "key":"user1",
    "value":{"_id":"doc1"},
    "doc": {
      "_id" : "doc1",
      "type" : "main_doc",
      "title" : "the first doc"
      // ...
     }
  },
  {
    // another doc, etc...
  }
]
于 2010-03-23T02:31:39.603 に答える
0

include_docs=truev0.11 でこの機能を使用できない場合は、ビュー/マップのデータを出力するときに、すべての情報を手元に用意する必要があります。

従来の「結合」スタイルの代わりに、「お気に入り」ユーザーのリストをmain_docドキュメントに保存することを検討してください。

{
   "_id" : "doc1",
   "type" : "main_doc",
   "title" : "the first doc",
   "favorited_by": ["user1", "user2"]
   // ...
}

そうすれば、ビューが実行されるときに、その 1 つのドキュメントの情報に基づいてすべてを出力できます。

function(doc) {
    if(doc.type == "main_doc") {
        for (var a in doc.favorited_by) {
            emit(doc.favorited_by[a], [doc._id, doc.title]);
        }
    }
}
于 2010-03-23T21:58:31.130 に答える