Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CouchDB查询问题_Javascript_Jquery_Couchdb - Fatal编程技术网

Javascript CouchDB查询问题

Javascript CouchDB查询问题,javascript,jquery,couchdb,Javascript,Jquery,Couchdb,我首先要说的是,虽然我对CouchDB并不陌生,但我对使用JavaScript和web查询视图并不陌生 我在这里已经看了很多其他问题,包括、、和,只是列出一些 虽然它们都有很好的信息,但我还没有找到一个有我特殊问题的 我的视图设置如下: function (docu) { if(docu.status && docu.doc && docu.orgId.toString() && !docu.deleted){ switch(docu.

我首先要说的是,虽然我对CouchDB并不陌生,但我对使用JavaScript和web查询视图并不陌生

我在这里已经看了很多其他问题,包括、、和,只是列出一些

虽然它们都有很好的信息,但我还没有找到一个有我特殊问题的

我的视图设置如下:

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;
    }
  }
}
所有文档都具有
状态
文档
组织ID
已删除
名称
eta
,以及
检查时间
。(由于我的自定义
doc
键,我将
doc
更改为
docu

我试图根据一组键,
status,doc,orgId
,其中orgId是一个整数,查询并发出
emit

要执行此操作,我的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
。我觉得我一定是做错了什么事情,使它不能正常工作

因此,对于我的问题:

  • 我没有提到这一点,但我必须设置
    docu.orgId.toString()
    ,因为我猜它将URL解析为字符串,有没有办法将此数字用作数值
  • 如何基于多个键正确查看多个文档,即如果(键1和键2)发出(doc.name,doc)
  • 我是否做了一些明显错误的事情,而我却没有注意到

  • 谢谢大家。

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

  • 当您使用
    docu.orgId.toString()时
    在if语句中,您基本上是在说:这个值必须是真的。如果您没有转换为字符串,那么除0以外的任何数字都是真的。因为您正在转换为字符串,所以除了空字符串以外的任何值都是真的。另外,因为您在
    发出
    调用中不使用
    orgId
    作为第一个参数,至少t不在上面的示例中,您根本无法通过它进行查询
  • 我会说的
  • 有一点
  • 要记住的是,
    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)我们想要通过
    类型
    部门
    名称
    ,来查询本例中的所有可用字段。我们将编写如下映射函数:

    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"],
      // ...
    });
    
    然后,我们将查询如下:

    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"],
      // ...
    });
    
    请注意,最后一个查询不是逻辑连接的
    ,而是联合的意思。如果您想将返回的内容限制在只有教授和Josh的文档中,有几个选项。最基本的方法是在发射时连接键。像

    emit('type-' + doc.type + '_name-' + doc.name, null);
    
    然后您可以这样查询:
    key:[“type-professor\u name-josh”]

    依赖这样的字符串感觉不太合适,至少在我刚开始使用它时不是这样,但它是查询键值存储的一种非常常见的方法。在本例中,字符-和u没有特殊意义,我只是将它们用作分隔符

    另一个选项是您在评论中提到的,发射一个类似

    emit([ doc.type, doc.name ], null);
    
    那么你会想要什么

    key: ["professor", "josh"]
    
    这很好,但通常情况下,将数组作为键发送的用例用于聚合返回的行。例如,您可以
    emit([year,month,day])
    如果您有一个简单的reduce函数,它基本上通过以下方式传递记录:

    function(keys, values, rereduce) {
      if (rereduce) {
        return [].concat.apply([], values);
      } else {
        return values;
      }
    }
    
    您可以将url参数
    group\u level
    设置为1或2进行查询,然后使用数组作为键,在完全相同的视图上按年、月或仅按年进行查询。与SQL或Mongo相比,它非常复杂和复杂,但嘿,它确实存在

    在视图中使用
    null
    确实是为了节省资源。当您查询视图时,行中包含一个
    \u id
    ,您可以在第二个ajax调用中使用该id来获取所有文档,例如
    \u all\u docs


    我希望这是有道理的。如果您需要任何澄清,您可以使用注释,我会尽我所能。

    所以,我使用If语句就像我应该使用emit一样?也就是说,如果我想返回所有compscii和命名为josh的文档,我会
    emit([doc.dept,doc.name],null)
    ?我的钥匙是
    [compsci,josh]
    ?我理解对了吗?是的,基本上。地图中不应该有任何查询逻辑。它所做的只是为您发出一个键值表。然后使用键值样式查询(例如前缀、范围、后缀等),根据需要进行查询。您可以使用
    [“compsci”,“josh”]
    进行查询,但在本例中,不需要将数组作为键发出。(尽管它对于聚合类型查询很有用)。您可以
    emit(dept+name,null)
    并查询“compscijosh”。马上就感觉脏了,但是如果你的钥匙结构正确就可以了。好的,酷。明天我会尝试一下,如果我得到你的答案,我会接受,如果我没有得到,我会回复你。谢谢。酷,我用更多的deets更新了问题。希望有帮助!虽然你的回答帮助我理解了我的问题,但我实际上使用了来自的答案来解决我的问题。不过,如果没有你的回答,我是不会明白的。再次感谢你!