Javascript CouchDB查询问题
我首先要说的是,虽然我对CouchDB并不陌生,但我对使用JavaScript和web查询视图并不陌生 我在这里已经看了很多其他问题,包括、、和,只是列出一些 虽然它们都有很好的信息,但我还没有找到一个有我特殊问题的 我的视图设置如下: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.
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解析为字符串,有没有办法将此数字用作数值谢谢大家。你们非常接近。来回答你们的问题
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更新了问题。希望有帮助!虽然你的回答帮助我理解了我的问题,但我实际上使用了来自的答案来解决我的问题。不过,如果没有你的回答,我是不会明白的。再次感谢你!