2017-05-06 25 views
0

我有一个NOSQL(Cloudant)数据库如何做一个链接的NoSql查询

-Within我们有文件的数据库文件所在的领域之一,代表“表”(文档类型)

-Within这些文件我们有代表链接其他文档数据库

内例如字段:

{_id: 111, table:main, user_id:222, field1:value1, other1_id: 333} 

{_id: 222, table:user, first:john, other2_id: 444} 

{_id: 333, table:other1, field2:value2} 

{_id: 444, table:other2, field3:value3} 

我们想要的搜索_id的方式:111

而且结果与数据某一文档的链接表:

{_id:111, user_id:222, field1:value1, other1_id: 333, first:john, other2_id: 444, field2:value2, field3:value3} 

有没有办法做到这一点?
我们如何存储或获取数据的结构具有灵活性 - 关于如何更好地构造数据以使其成为可能的任何建议?

回答

1

首先要说的是,Cloudant中没有连接。如果你的模式依赖于大量的加入,那么你正在对付Cloudant这可能意味着额外的复杂性或性能命中。

有一种方法可以在MapReduce视图中取消引用其他文档的ID。下面是它如何工作的:

  • 创建MapReduce的观点发出主文档的身体和其链接的文档的IDS形式{ _id: 'linkedid'}
  • 查询视图与include_docs=true给拉了回来文档和解除引用的IDS在一个去

在你的情况,地图功能是这样的:

function(doc) { 
    if (doc.table === 'main') { 
    emit(doc._id, doc); 
    if (doc.user_id) { 
     emit(doc._id + ':user', { _id: doc.user_id }); 
    } 
    } 
} 

将允许你拉回来m个艾因文件,通过敲击GET /mydatabase/_design/mydesigndoc/_view/myview?startkey="111"&endkey="111z"&include_docs=true端点一个API其链接的用户文档:

{ 
    "total_rows": 2, 
    "offset": 0, 
    "rows": [ 
    { 
     "id": "111", 
     "key": "111", 
     "value": { 
     "_id": "111", 
     "_rev": "1-5791203eaa68b4bd1ce930565c7b008e", 
     "table": "main", 
     "user_id": "222", 
     "field1": "value1", 
     "other1_id": "333" 
     }, 
     "doc": { 
     "_id": "111", 
     "_rev": "1-5791203eaa68b4bd1ce930565c7b008e", 
     "table": "main", 
     "user_id": "222", 
     "field1": "value1", 
     "other1_id": "333" 
     } 
    }, 
    { 
     "id": "111", 
     "key": "111:user", 
     "value": { 
     "_id": "222" 
     }, 
     "doc": { 
     "_id": "222", 
     "_rev": "1-6a277581235ca01b11dfc0367e1fc8ca", 
     "table": "user", 
     "first": "john", 
     "other2_id": "444" 
     } 
    } 
    ] 
} 

通知我们如何得到两排后面,第一个是主文档正文,第二链接的用户。