我将首先说,虽然我不熟悉CouchDB,但我是使用JavaScript和网络查询视图的新手。
我在这里查看了其他多个问题,包括CouchDB - Queries with params,couchDB queries,Couchdb query with AND operator,CouchDB Querying Dates和Basic 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;
}
}
}
所有文档都包含status
,doc
,orgId
,deleted
,name
,eta
和checkTime
。 (由于我的自定义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
。我觉得我必须为此做错事,不能正常工作。
所以对于我的问题:
docu.orgId.toString()
,因为我猜它会将URL解析为字符串,有没有办法将这个数字用作数值?if(key1 && key2) emit(doc.name, doc)
谢谢大家。
答案 0 :(得分:2)
你非常接近。回答你的问题
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
和{{查询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
。
我希望这是有道理的。如果您需要任何澄清,可以使用评论,我会尽力。