CouchDB查询问题



我会说,虽然我不是couchdb的新手,但我是新手使用javascript和网络查询视图的新手。

我在此处查看了其他多个问题,包括couchdb-带有参数,couchdb查询的查询,couchdb查询和操作员,couchdb查询日期和基本的couchdb查询,只是列出了一些。

> >

虽然所有这些都有很好的信息,但我还没有找到一个有我的特殊问题的信息。

我有一个类似的视图:

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密钥,我将doc更改为docu

我试图根据一组键status, doc, orgId查询和emit,其中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. 我是否在做一些错误的事情,我缺乏注意到的知识?

谢谢大家。

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

  1. 当您使用docu.orgId.toString()时,您基本上要说的是:这个值必须是真实的。如果您没有转换为字符串,则除0以外的任何数字都是正确的。由于您要转换为字符串,因此除空字符串以外的任何值都是true。另外,由于您不使用orgId作为emit调用中的第一个参数,至少在上面的示例中,您根本无法查询。
  2. 我会做到这一点。
  3. 一点。

要记住的事情是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)我们想通过typedeptname查询所有可用字段。我们会写下这样的地图函数:

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"],
  // ...
});

请注意,最后一个查询不是and,从逻辑连词的意义上讲,它是在结合的意义上。如果您想限制返回的文件,这些文件仅是教授和乔什,有一些选择。最基本的是在发射时将钥匙连接起来。喜欢

emit('type-' + doc.type + '_name-' + doc.name, null);

您会这样查询:key : ["type-professor_name-josh"]

依靠这样的字符串并不是很合适的,至少在我刚开始这样做时,这对我来说并不适合,但这是查询钥匙值商店的一种非常普遍的方法。字符 - _在此示例中没有特殊的含义,我只是将它们用作定界符。

另一种选择是您在评论中提到的内容,以发出像

这样的数组
emit([ doc.type, doc.name ], null);

然后您会像

一样查询
key: ["professor", "josh"]

这很好,但是通常,将数组作为键发射的用例是用于聚合返回的行。例如,您可以emit([year, month, day]),如果您具有简单的减少功能,从基本上通过记录:

function(keys, values, rereduce) {
  if (rereduce) {
    return [].concat.apply([], values);
  } else {
    return values;
  }
}

您可以使用将URL参数group_level设置为1或2查询,并使用数组与键一样,按年或每月或仅一年的一年开始查询。与SQL或Mongo相比,它疯狂而复杂,但是,嘿,它在那里。

在视图中使用null确实是为了节省资源。查询视图时,行包含一个_id,您可以在第二个AJAX调用中使用该行,以从例如_all_docs获取所有文档。

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

最新更新