如何在CouchDb文档中提取嵌入的1:1数据

时间:2017-03-30 01:39:13

标签: couchdb

我正在使用CouchDb存储我的文档并找出如何使用CouchDb视图在文档上提取1:1相关数据。

对于这个给定的文档结构,

{
  _id: 'some_id',
  doc_type: 'item',
  name: 'Steel Caliper'
  description: 'Steel Caliper description',
  classification: {
    _id: 'some_classification_id'
  }
}

classification: {
  _id: 'some_classification_id',
  doc_type: 'classification',
  name: 'Hand Tools'
}

当我使用下面的CouchDb视图检索项目文档列表时(使用include_docs = true调用)

function(doc) {
  if(doc_type==='item') {
     emit(doc.name, null);
  }
}

我收到了项目文件,但没有提取分类数据。

{
  "total_rows": 10,
  "offset": 0,
  "rows": [
    {
      "id": "some_id",
      "key": "Steel Caliper",
      "value": null,
      "doc": {
        "_id": "some_id",
        "_rev": "1-65d32fe22a0b949ff73f23c65042ae3c"
        "doc_type": "item"
        "name": "Steel Caliper"
        "classification": {
          "_id": "some_classification_id"
        }
      }
    },
    { ... }
}

有没有办法使用视图提取分类数据并得到如下所示的输出?

...
    "doc": {
       "_id": "some_id",
       "_rev": "1-65d32fe22a0b949ff73f23c65042ae3c"
       "doc_type": "item"
       "name": "Steel Caliper"
       "classification": {
          "_id": "some_classification_id",
          "doc_type": "classification",
          "name": "Hand Tools"
       }
    }
...

1 个答案:

答案 0 :(得分:1)

是的,这称为视图整理。如果要通过_ids加入,则可以发出多个文档。

在您的情况下,您可以致电

function(doc) {
   if(doc_type==='item') {
     emit(doc.name, null);
     if( doc.classification ){
         emit( doc.classification._id, {_id: doc.classification._id });
     }

   }
}

您可能仍然需要使用返回的结果来将其转换为您想要的形式。

http://docs.couchdb.org/en/2.0.0/couchapp/views/joins.html