什么是最大价值的化合物CouchDB钥匙?
-
19-09-2019 - |
题
我使用的是什么似乎是一个常见的伎俩建立一个参观:
// a Customer has many Orders; show them together in one view:
function(doc) {
if (doc.Type == "customer") {
emit([doc._id, 0], doc);
} else if (doc.Type == "order") {
emit([doc.customer_id, 1], doc);
}
}
我知道我可以用下面的查询,以获得一个 customer
和所有相关的 Order
s:
?startkey=["some_customer_id"]&endkey=["some_customer_id", 2]
但现在我已经绑住我的询问 非常 密切合作,以我的观点代码。是否有价值,我可以把我把我的"2
"为更清楚说,"我想要的 的一切 绑到这个顾客"?我想我已经看到了
?startkey=["some_customer_id"]&endkey=["some_customer_id", {}]
但我不确定 {}
是 某些 排序 后 其他一切。
信贷 cmlenz 为加入方法。
进一步澄清的 CouchDB wiki网页上的排序规则:
查询
startkey=["foo"]&endkey=["foo",{}]
将符合大多数组键用"foo"的第一个元素,例如["foo","bar"]
和["foo",["bar","baz"]]
.然而,它将不匹配["foo",{"an":"object"}]
所以 {}
是 晚 在排序,但绝对不是 最后一个.
解决方案
而不是试图找到的 最伟大的 可能值 第二 元件阵列中的关键,我建议,而不是试图找到的 少 可能的价值大于 第一: ?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false
.
其他提示
我有两个想法。
使用时间戳
而不是使用简单的0和1对他们的排序规则的行为、使用的时间戳,创建记录(假定它们的部分记录)a la [doc._id, doc.created_at]
.然后你可以查询视startkey的一些足够早日(epoch可能工作),和一个endkey的"现在",例如: date +%s
.关键的范围应当总是包括一切,它具有的好处整理的日期,这可能是你想要什么,反正。
或者,只是不要担心它
你可能只是指通过的customer_id并没有什么更多。这将有很好的优点是能够查询使用的只是 key=<customer_id>
.肯定的是,该记录就不会被整理他们回来的时候,但是,一个问题,对你的应用程序?除非你期待吨的记录后,就有可能微不足道,只需摘下的客户记录的列表,一旦你有检索的数据的应用程序。
例如,在红宝石:
customer_records = records.delete_if { |record| record.type == "customer" }
不管怎么说,时间戳是可能更有吸引力的回答你的情况。
CouchDB主要是写在爱尔兰.我不认为会有一个上限一串化合物/元组合键尺寸比其他系统的资源(例如一个关键因此它长期使用所有可用的存储器)。限制CouchDB可扩展性是未知的,根据CouchDB的网站。我猜想你可能会不断增加的领域进入一个巨大的组合主的关键和唯一的东西会阻止你是系统的资源或硬限制,如最大的整数的大小目标的架构。
由于CouchDB存储的一切使用式,它可能是局限于最大数量的值的写法标准。所有数字在JavaScript被储存作为一个浮点IEEE754倍。我认为64位双代表能值-5e-324+1.7976931348623157e+308。
现在看来似乎是不错的一个特点endKey可能是包容性而不是排斥的。
这应该做的把戏:
?startkey=["some_customer_id"]&endkey=["some_customer_id", "\uFFFF"]
这应该包括什么,开始用字符低于\uFFFF(所有unicode字)