CouchDB使用数组查找键发出,这样就忽略了数组元素的顺序

时间:2011-01-08 22:51:35

标签: couchdb

索引couchdb视图时,可以发出一个数组作为键,例如: 发射([“一”,“二”,“三”],doc); 我很欣赏这样一个事实:在搜索视图时,顺序很重要,但有时我希望视图忽略它。我想到了几个选择。 按照惯例,只按字母顺序发出内容,并确保查找使用相同的约定。 2.以某种方式散列,忽略顺序,并根据该散列发出/搜索。 (这很简单,如果你只是单独散列每一个,“求和”哈希,然后修改。) 注意:我确信这可能会在权威指南的某处介绍,但我找不到它。

2 个答案:

答案 0 :(得分:1)

看起来正确的方法是确定密钥的传统排序,以此顺序发出它们,并确保查询强制执行此排序。否则我们需要发出密钥的所有n(阶乘)排列(如果n大于3,则可能会变坏)

答案 1 :(得分:0)

CouchDB将始终按顺序维护数组键。您是否考虑过将所有序列变化作为视图的一部分?有点像:


function(doc) {
  function computeAllKeyVariations(fromKey) {
    // returns array of key arrays
  }
  var allKeys = computeAllKeyVariations(startingKey);
  for (k in allKeys) {
    emit(k, doc); // or emit(k, null)
  }
}

附注:您还可以选择使用emit(['one','two','three'], null)而不是发出文档。这将避免让CouchDB将完整文档存储在视图索引中(不止一次)。要获得与之前相同的结果,只需使用&include_docs=true