我的当前id键包含3或4段:
namespace::my_key::id
namespace::my_key::my_second_key::id
解决方案1。使用复杂id并通过在id中搜索键
来创建视图function (doc, meta) {
if(meta.id.indexOf("::my_key::") !== -1){
emit([doc.source_id], [doc.name,doc.title,doc.ui]);
}
}
解决方案2。为每个文档添加像"type", "namespace"这样的字段并使用它们创建视图
function (doc, meta) {
if(doc.type=='my_key'){
emit([doc.source_id], [doc.name,doc.title,doc.ui]);
}
}
如果我选择方案2,我必须在我的应用程序上维护id,可能我会像解决方案1中那样做。
有人有命名id和创建视图的经验吗?每个解决方案都有什么问题。或者indexOf()函数是不推荐的?
Couchbase在后台建立视图索引,所以如果你不使用stale=false
参数,你将在两种解决方案中获得相同的性能从视图获取文档。
在第一个解决方案中,你可能会得到比第二个更长的键,因为在第二个解决方案中,你可以在doc中存储类型,而不是meta。Couchbase将所有元数据保存在内存中,所以键越长,需要的内存就越多。indexOf
比==
和===
慢,所以建立索引需要更多的时间。
所以我认为第二个解决方案更好。
您还可以通过仅发出emit(doc.source_id, null)
并在客户端库中使用IncludeDocs
来提高视图的磁盘使用率。这将减少它们的大小,几乎不会影响性能。
这里还有一个"最佳实践"的链接。也许这也会有帮助。
我使用像你的解决方案1。
在我的例子中(社交游戏后端服务器),key name表示存储的数据类型,例如,"player:{zone_id}:{uid}","playerchar:{zone_id}:{player_uid}:{char_id}"等。所以我没有在文档中添加type字段,因为应用程序知道它想要什么,从不需要来自value content的信息来进行反射。
关于性能/速度,对不起,我不能给出任何建议,我没有查询数据与视图的要求,我创建的所有视图只适用于开发& &;备份环境,数据分析;