我正在使用似乎是创建连接视图的常用技巧:
// 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
:
?startkey=["some_customer_id"]&endkey=["some_customer_id", 2]
但是现在我已经将我的查询非常与我的视图代码紧密联系起来了。在我将“2
”更清楚地说“我希望所有与此客户相关联”时,我可以放置一个值吗?我想我见过
?startkey=["some_customer_id"]&endkey=["some_customer_id", {}]
但我不确定{}
某些在其他所有内容之后对进行排序。
感谢cmlenz加入方法。
CouchDB wiki page on collation:
进一步澄清查询
startkey=["foo"]&endkey=["foo",{}]
会将大多数数组键与第一个元素中的“foo”匹配,例如["foo","bar"]
和["foo",["bar","baz"]]
。但是它不匹配["foo",{"an":"object"}]
因此排序顺序中{}
晚,但绝对不是最后。
答案 0 :(得分:2)
我有两个想法。
使用时间戳
使用创建记录的时间戳(假设它们是记录的一部分)a la [doc._id, doc.created_at]
,而不是使用简单的0和1作为其归类行为。然后你可以用一个足够早的日期(epoch可能会起作用)的开始键和一个“now”的结束键来查询你的视图,例如date +%s
。该关键范围应始终包含所有内容,并且它具有按日期进行整理的额外好处,这可能是您想要的。
或者,不要担心
您可以通过customer_id进行索引,仅此而已。这将具有仅使用key=<customer_id>
进行查询的优点。当然,记录在回来时不会被整理,但这对您的申请来说是个问题吗?除非您预计会有大量的记录,否则一旦您的应用程序检索到数据,就可以简单地将客户记录从列表中删除。
例如在ruby中:
customer_records = records.delete_if { |record| record.type == "customer" }
无论如何,时间戳可能是对你的案件更有吸引力的答案。
答案 1 :(得分:1)
我建议不要试图找到数组键中 second 元素的最大可能值,而是尝试找到至少可能的值大于 first :?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false
。
答案 2 :(得分:0)
CouchDB主要用Erlang编写。我不认为除了系统资源之外的字符串复合/复合键元组大小会有一个上限(例如,一个键只要它使用所有可用内存)。根据CouchDB站点,CouchDB可扩展性的限制是未知的。我猜你可以继续将字段添加到一个巨大的复合主键中,唯一可以阻止你的是系统资源或硬限制,例如目标体系结构上的最大整数大小。
由于CouchDB使用JSON存储所有内容,因此可能仅限于ECMAScript标准中的最大数值.JavaScript中的所有数字都存储为浮点IEEE 754双精度值。我相信64位双精度值可以表示从 - 5e-324到+ 1.7976931348623157e + 308的值。
答案 3 :(得分:0)
似乎有一个功能,其中endKey可以包容而不是独占。
答案 4 :(得分:0)
这应该可以解决问题:
?startkey=["some_customer_id"]&endkey=["some_customer_id", "\uFFFF"]
这应该包括以小于\ uFFFF(所有unicode字符)
的字符开头的任何内容