复合CouchDB密钥的最大值是多少?

时间:2009-07-24 22:25:20

标签: javascript couchdb mapreduce

我正在使用似乎是创建连接视图的常用技巧:

// 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"}]

因此排序顺序中{} ,但绝对不是最后

5 个答案:

答案 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字符)

的字符开头的任何内容