CouchDB查询问题

时间:2016-12-05 22:03:01

标签: javascript jquery couchdb

我将首先说,虽然我不熟悉CouchDB,但我是使用JavaScript和网络查询视图的新手。

我在这里查看了其他多个问题,包括CouchDB - Queries with paramscouchDB queriesCouchdb query with AND operatorCouchDB Querying DatesBasic CouchDB Queries,仅举几例

虽然他们都掌握了很好的信息,但我还没有找到一个有特殊问题的信息。

我有一个像这样的视图设置:

function (docu) {
  if(docu.status && docu.doc && docu.orgId.toString() && !docu.deleted){
    switch(docu.status){
      case "BASE":
        emit(docu.name, docu);
      break;
      case "AIR":
        emit(docu.eta, docu);
      break;
      case "CHECK":
        emit(docu.checkTime, docu);
      break;
    }
  }
}

所有文档都包含statusdocorgIddeletednameetacheckTime 。 (由于我的自定义doc密钥,我将docu更改为doc

我正在尝试根据一组键emit查询和status, doc, orgId,其中orgId是一个整数。

我这样做的jQuery看起来像这样:

$.couch.db("myDB").view("designDoc/viewName", {
    keys : ["status","doc",orgId],
    success: function(data) {
        console.log(data);
    },
    error: function(status) {
        console.log(status);
    }
});

我收到了

{"total_rows":59,"offset":59,"rows":[

]}

有时偏移量为0,有时为59。我觉得我必须为此做错事,不能正常工作。

所以对于我的问题:

  1. 我没有提到这个,但我必须设置docu.orgId.toString(),因为我猜它会将URL解析为字符串,有没有办法将这个数字用作数值?
  2. 如何根据多个密钥正确查看多个文档,即if(key1 && key2) emit(doc.name, doc)
  3. 我做了一些明显错误的事情,我缺乏知识注意事项吗?
  4. 谢谢大家。

1 个答案:

答案 0 :(得分:2)

你非常接近。回答你的问题

  1. 当您在if语句中使用docu.orgId.toString()时,您基本上会说:此值必须是真实的。如果您没有转换为字符串,则除0之外的任何数字都将为真。由于您要转换为字符串,因此除空字符串之外的任何值都将为true。此外,由于您不使用orgId作为emit调用中的第一个参数,至少在上面的示例中没有,您根本无法进行查询。
  2. 我会接受这个。
  3. 一点点。
  4. 要记住的是emit创建了一个可用于查询的键值表(实际上是一个视图)。我们说我们有以下文件

    {type:'student',   dept:'psych',     name:'josh'},
    {type:'student',   dept:'compsci',   name:'anish'},
    {type:'professor', dept:'compsci',   name:'kender'},
    {type:'professor', dept:'psych',     name:'josh'},
    {type:'mascot',                      name:'owly'}
    

    现在让我们知道,对于这一个视图,我们想查询1)除了吉祥物之外的所有内容,2)我们想要按typedept和{{查询1}},此示例中的所有可用字段。我们会写一个这样的地图函数:

    name

    然后,我们会这样查询:

    function(doc) {
    
      if (doc.type === 'mascot') { return; } // don't do anything
    
      // allow for queries by type
      emit(doc.type, null); // the use of null is explained below
    
      // allow queries by dept
      emit(doc.dept, null);
    
      // allow for queries by name
      emit(doc.name, null);
    
    }
    

    请注意,最后一个查询不是// look for all joshs $.couch.db("myDB").view("designDoc/viewName", { keys : ["josh"], // ... }); // look for everyone in the psych department $.couch.db("myDB").view("designDoc/viewName", { keys : ["psych"], // ... }); // look for everyone that's a professor and everyone named josh $.couch.db("myDB").view("designDoc/viewName", { keys : ["professor", "josh"], // ... }); ,而是在逻辑联合意义上,它是联盟意义上的。如果你想限制返回到只有教授和joshs的文档,那么有一些选择。最基本的是在发射时连接键。像

    and

    然后你会这样查询:emit('type-' + doc.type + '_name-' + doc.name, null);

    依靠这样的字符串感觉不太合适,至少在我第一次开始这样做时对我来说并不是这样,但这是一种查询键值存储的常用方法。字符 - 和_在这个例子中没有特殊含义,我只是将它们用作分隔符。

    另一种选择是你在评论中提到的,发出像

    这样的数组
    key : ["type-professor_name-josh"]

    然后你会查询

    emit([ doc.type, doc.name ], null);
    

    这很好,但通常,将数组作为键发出的用例是聚合返回的行。例如,您可以key: ["professor", "josh"] ,如果您有一个简单的reduce函数,它基本上通过以下内容传递记录:

    emit([year, month, day])

    您可以使用设置为1或2的url参数function(keys, values, rereduce) { if (rereduce) { return [].concat.apply([], values); } else { return values; } } 进行查询,并使用数组作为键,以完全相同的视图开始按年份或月份查询。与SQL或Mongo相比,它的复杂和复杂是疯狂的,但是嘿,它就在那里。

    在视图中使用group_level实际上是为了节省资源。查询视图时,行包含null,您可以在第二次ajax调用中使用该行来获取所有文档,例如_id

    我希望这是有道理的。如果您需要任何澄清,可以使用评论,我会尽力。