我会说,虽然我不是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;
}
}
}
所有文档具有status
,doc
,orgId
,deleted
,name
,eta
和checkTime
。(由于我的自定义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
。我觉得我一定做错了什么,所以不正常工作。
所以我的问题:
- 我没有提到这一点,但是我不得不设置
docu.orgId.toString()
,因为我想它将URL解析为字符串,是否有一种方法可以将此数字用作数字值? - 如何根据多个密钥正确查看多个文档,即
if(key1 && key2) emit(doc.name, doc)
- 我是否在做一些错误的事情,我缺乏注意到的知识?
谢谢大家。
您非常接近。回答您的问题
- 当您使用
docu.orgId.toString()
时,您基本上要说的是:这个值必须是真实的。如果您没有转换为字符串,则除0以外的任何数字都是正确的。由于您要转换为字符串,因此除空字符串以外的任何值都是true。另外,由于您不使用orgId
作为emit
调用中的第一个参数,至少在上面的示例中,您根本无法查询。 - 我会做到这一点。
- 一点。
要记住的事情是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)我们想通过type
,dept
和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"],
// ...
});
请注意,最后一个查询不是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
获取所有文档。
我希望这是有道理的。如果您需要任何澄清,可以使用评论,我会尽力而为。