4

CouchDB のリンクされたドキュメント機能について理解するのに苦労しています。

types単一の CouchDB データベースに2 つのデータが格納されています。

{
  "id":"1",
  "type": "track",
  "title": "Bohemian Rhapsody"
}

{
  "id":"2",
  "type": "artist",
  "name": "Queen",
  "tracks": ["1"]
}

以下のようなビューを記述して、次のドキュメントを発行できるという印象を受けています。

{
  "id":"2",
  "type": "artist",
  "name": "Queen",
  "tracks": [
    {
      "id":"1",
      "type": "track",
      "title": "Bohemian Rhapsody"
    }
  ]
}

このビューを試してみましたが、期待どおりに機能していません。

function(doc) {
  if(doc.type == 'artist') {
    var tracks = [];
    for(var i = 0; i < doc.tracks.length; i++) {
      tracks.push({_id:doc.tracks[i]});
    }

    newdoc = eval(uneval(doc));
    newdoc.tracks = tracks;

    emit(doc._id,newdoc);
  }
}

例: http://jphastings.iriscouch.com/_utils/database.html?music/_design/test/_view/linked

これは私が望んでいたものを返していません - 何か提案はありますか? ありがとう

4

1 に答える 1

4

はい、これは可能です。方法は次のとおりです。

2 つのドキュメントがあります

{
"_id":"anyvalue",
"type": "track",
"title": "Bohemian Rhapsody"
}

{
"_id":"2",
"type": "artist",
"name": "Queen",
"tracks": ["anyvalue"]
}

あなたが間違っていたのは、トラックの値(配列内のアイテム)を引用符で囲んでいなかったことです。

2)これが機能するには、参照 ID が _id である必要があります。id フィールドを持つことはできますが、ドキュメントの識別には _id のみが使用されるため、違いは注目に値します。

必要な結果を得るには、このビューで十分です

function(doc) {
    if (doc.type === 'artist') {
        for (var i in doc.tracks) {
            var id = doc.tracks[i];
            emit(id, { _id: id });
        }
    }
}

あなたがしたいことは、すべてのアーティストの「トラック」の id フィールドを発行するために、for ループ内で発行関数を使用することです。

次に、include_docs=true パラメーターを使用して、couch db ビューにクエリを実行します。これが、アイリス カウチで作成したデータベースの最終結果です。

http://jphastings.iriscouch.com/music/_design/test/_view/nested?reduce=false&include_docs=true

 {
"total_rows": 3,
"offset": 0,
"rows": [
 {
  "id": "0b86008d8490abf0b7e4f15f0c6a50a7",
  "key": "0b86008d8490abf0b7e4f15f0c6a463b",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a463b"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a463b",
    "_rev": "3-7e4ba3bfedd29a07898125c09dd7262e",
    "type": "track",
    "title": "Boheniam Rhapsody"
  }
},
{
  "id": "0b86008d8490abf0b7e4f15f0c6a50a7",
  "key": "0b86008d8490abf0b7e4f15f0c6a5ae2",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a5ae2"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a5ae2",
    "_rev": "2-b3989dd37ef4d8ed58516835900b549e",
    "type": "track",
    "title": "Another one bites the dust"
  }
},
{
  "id": "0b86008d8490abf0b7e4f15f0c6a695e",
  "key": "0b86008d8490abf0b7e4f15f0c6a6353",
  "value": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a6353"
  },
  "doc": {
    "_id": "0b86008d8490abf0b7e4f15f0c6a6353",
    "_rev": "2-0383f18c198b813943615d2bf59c212a",
    "type": "track",
    "title": "Stripper Vicar"
  }
 }
]
}

ジェイソンはこの投稿でそれを素晴らしく説明しています

CouchDB で 1 対多の「JOIN」を行う最良の方法

このリンクは、couch db のエンティティ関係にも役立ちます

http://wiki.apache.org/couchdb/EntityRelationship

于 2013-01-30T11:37:15.583 に答える