[使用Cloudant从mongo切换到pouchdb,我喜欢“每个用户一个数据库”的概念,但是有没有办法为每个数据库创建多个集合/表?
示例
- Peter
- History
- Settings
- Friends
- John
- History
- Settings
- Friends
等...
Couchdb没有集合的概念。但是,结合使用Couchdb视图,可以在文档上使用类型标识符来获得类似的结果。
类型标识符
当您将文档保存在Couchdb中时,添加一个用于指定类型的字段。例如,您将这样存储一个朋友:
{
_id: "XXXX",
type: "Friend",
first_name: "John",
...
}
您将这样存储历史记录:
{
_id: "XXXX",
type: "History",
url: "http://www.google.com",
...
}
这两个文档都在同一个数据库中,如果您查询了该数据库中的所有文档,那么您将同时收到这两个文档。
视图
您可以创建按类型过滤的视图,然后直接查询这些视图。例如,创建一个视图来检索这样的朋友(在Cloudant中,您可以添加新的设计文档,并且可以直接复制并粘贴):
{
"_id" : "_design/friends",
"views" : {
"all" : {
"map" : "function(doc){ if (doc.type && doc.type == 'Friend') { emit(doc._id, doc._rev)}}"
}
}
}
让我们扩展地图功能:
function(doc) {
if (doc.type && doc.type == "Friend") {
emit(doc._id, doc._rev);
}
}
实质上,此地图功能是说仅将类型==“ Friend”的文档与该视图关联。现在,我们可以查询此视图,并且只会返回朋友:
http://SERVER/DATABASE/_design/friends/_view/all
friends
=设计文档的名称,all
=视图的名称。将SERVER
替换为服务器,并将DATABASE
替换为数据库名称。
您可以在此处找到有关视图的更多信息:
https://wiki.apache.org/couchdb/Introduction_to_CouchDB_views
您可以在relational-pouch中查找类似内容。否则,您可以做“每个用户3个数据库”。 ;)
我可能没有完全理解您的需求,但总的来说,您可以在CouchDB / Cloudant / PouchDB中以3种不同的方式实现您所描述的内容。
通常,您的数据架构决策取决于并发性。您提到了PouchDB,所以可能是您有一个单线程客户端,而选项1很好也很容易?