【问题标题】:CouchDB and multiple keysCouchDB 和多个键
【发布时间】:2017-11-22 03:49:30
【问题描述】:

是否可以在 CouchDB 中使用类似的查询?喜欢使用两个键

SELECT field FROM table WHERE value1="key1" OR value2="key2"

我一直只用一把钥匙。

function(doc) {

    emit(doc.title, doc);

}

谢谢。

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    在 CouchDB 0.9 及更高版本中,您可以 POST 到具有如下正文的视图(或 _all_docs):

    {"keys": ["key1", "key2", ...]}
    

    为了检索具有匹配键的行集。

    【讨论】:

    • 这没有回答问题。一旦你确定了你想要的文件,这只是获取文件。诀窍是找出你想要的文件列表。
    【解决方案2】:

    是的。如果我理解你的问题,这样的事情应该可以解决问题:

    function(doc) {
      a = (doc.value1 && doc.value1 == "key1");
      b = (doc.value2 && doc.value2 == "key2");
      if (a || b) {
        emit(doc._id,doc.title);
      }
    }
    

    只发出您需要的文档或值。

    【讨论】:

    • 好吧,当然,如果你事先知道“key1”和“key2”,但如果你想让它们成为“动态”参数呢?
    【解决方案3】:

    我会将此添加到 duluthian 的回复中:

     emit(doc.title, null)
    

    您始终可以使用view api. 提取“_id”和文档值

    【讨论】:

      【解决方案4】:

      你可以像这样创建一个视图:

      function(doc){
          if(doc.value1) emit(doc.value1, doc.field);
          if(doc.value2) emit(doc.value2, doc.field);
      }
      

      然后使用 llasram 的建议查询它以 POST 到视图:

      {"keys": ["key1", "key2", ...]}
      

      不过,您的客户必须对重复操作保持警惕。 doc.value1 == "key1" && doc.value2 == "key2" 的文档将显示两次。只需使用 _id 过滤结果。

      【讨论】:

        【解决方案5】:

        需要稍微扩展一下 llasram 的答案;索引必须包含两个字段的值:

        function(doc) {
          emit("value1:"+doc.value1); // add check for undefined, null, etc.
          emit("value2:"+doc.value2);
        }
        

        然后查询

        keys=["value1:key1","value2:key2"]
        

        编辑:但是,如果它包含匹配的值+键对,这将多次报告同一个文档。

        【讨论】:

          【解决方案6】:

          您可以通过使用 2 个单独的视图和一些客户端处理来做到这一点(假设您需要“动态参数”):

          您将在“field1”上有一个视图,您可以使用“value1”进行查询。 (获取文档 ID 列表)

          然后您查询“field2”的第二个视图,传递“value2”,并获取另一个文档 ID 列表。

          现在,您只需找到 2 个 ID 号码列表的“交集” (留给读者练习)

          【讨论】:

          • 它不适用于大量数据。交集是 O(n log n),它会让客户端因足够的结果而窒息
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多