我可以为每个数据库创建多个集合吗?
Can I create multiple collections per database?
从 mongo 切换到 pouchdb(使用 Cloudant),我喜欢 "one database per user" 概念,但是有没有办法为每个数据库创建多个 collections/tables?
示例
- 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 种不同方式实现您描述的内容。
- 每人一份文件(彼得、约翰)。当然 - 如果集合不是很大,更重要的是如果它们不是由不同的用户同时更新(或者更糟的是在不同的数据库实例中)导致冲突,那么在 JSON 中每个集合只有一个元素,包含一个数组和你可以只用一个文件来操纵一切。让访问变得轻而易举。
- 每个集合一个文档(Peter History、Peter Settings 等)。类似的约束,但您可以创建一个文档来保存这些集合中的每一个。如果它们不会经常同时修改,那么您将拥有一个 Peter's History 文档和另一个 Peter's Settings 文档。
- 每个项目一个文档。这是最好的粒度方法——许多小的简单文档,每个文档包含一个元素(比如 Peter 的单个历史条目)。代码变得稍微简单一些,因为删除项目变成了删除,许多客户端可以同时更新项目,但现在您依赖视图将所有项目放入列表中。例如,带有键 [person, listName, item] 的视图可以让您访问您想要的内容。
通常,您的数据模式决策归结为并发性。您提到了 PouchDB,所以您可能有一个单线程客户端,而选项 1 既好又简单?
从 mongo 切换到 pouchdb(使用 Cloudant),我喜欢 "one database per user" 概念,但是有没有办法为每个数据库创建多个 collections/tables?
示例
- 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 种不同方式实现您描述的内容。
- 每人一份文件(彼得、约翰)。当然 - 如果集合不是很大,更重要的是如果它们不是由不同的用户同时更新(或者更糟的是在不同的数据库实例中)导致冲突,那么在 JSON 中每个集合只有一个元素,包含一个数组和你可以只用一个文件来操纵一切。让访问变得轻而易举。
- 每个集合一个文档(Peter History、Peter Settings 等)。类似的约束,但您可以创建一个文档来保存这些集合中的每一个。如果它们不会经常同时修改,那么您将拥有一个 Peter's History 文档和另一个 Peter's Settings 文档。
- 每个项目一个文档。这是最好的粒度方法——许多小的简单文档,每个文档包含一个元素(比如 Peter 的单个历史条目)。代码变得稍微简单一些,因为删除项目变成了删除,许多客户端可以同时更新项目,但现在您依赖视图将所有项目放入列表中。例如,带有键 [person, listName, item] 的视图可以让您访问您想要的内容。
通常,您的数据模式决策归结为并发性。您提到了 PouchDB,所以您可能有一个单线程客户端,而选项 1 既好又简单?