我在couchdb中有一组文档,我在这里提到了一个示例文档:
{
"_id": "26",
"_rev": "1-53ac67e9ec4b4ce8ffa9cd609e107aaf",
"customer_name": "Vadilal",
"type": "trip",
"duration": "10 hours 27 mins",
"end_time": "Jan 1, 2014 10:11:00 PM",
"start_time": "Jan 11, 2014 8:46:00 AM",
}
如果我从网址传递timestamp(key)
,如果它位于start_time
和end_time
之间,那么我想获取文档。
示例:
假设网址会像这样
.../trip/_design/trip/_view/trip?key="Jan 10, 2014 8:46:00 AM"
此处我将时间戳记作为Jan 10, 2014 8:46:00 AM
,因此它位于上述文档的start_time
和end_time
之间,在这种情况下,我需要获取剩余的信息。
请帮助弄清楚这个问题,对我来说会有很大的帮助。
我写了如下函数:
function(doc){
if(doc.type=="trip"){
var startTime=new Date(doc.start_time);
var endTime=new Date(doc.end_time);
emit([startTime.getTime(),endTime.getTime()], doc);
}
并按以下方式调用网址:
../trip/_design/trip/_view/trip?startkey=[1390086890000]&endkey=[1390086890000,{}]
根据我的要求高于一个???
答案 0 :(得分:4)
遗憾的是,这是不可能的。您的要求有两个问题。
视图按键排列
您可以编写这样的视图,分别通过开始键或结束键索引文档。
function(doc){
emit(doc.start_time, doc_id); // amend with end key to index by end key.
}
您可以在查询中使用三个参数:
排序问题
根据类型,索引键将按字母顺序或整数排序。
因此,如果您的视图trip
正在使用这样的开始键:
.../trip/_design/trip/_view/trip?start_key="Jan 10, 2014 8:46:00 AM"
您可以返回大于或等于字符串“2014年1月10日......”的所有值,这对于“2014年1月11日”或“2014年1月31日”都是正确的,但是“7月”会出现误报“2011年2月1日”的22或“假阴性”为F<学家
要解决此问题,您必须将开始日期转换为可按时间顺序排序的内容,例如:
这两个都会正确排序。
你能解决问题吗
是的,但是有一点客户端代码。这是食谱:
trip/by_start_date
和trip/by_end_date
,分别将开始日期和结束日期作为键返回。按照上面第二部分排序的方式。 ..._view/by_start_date?endkey=[your_date]
..._view/by_end_date?startkey=[your_date]
进一步优化
在上面的解决方案中,您可能只会返回太多值来处理。您可以使用CouchDB键入多个值来进一步减少它。按开始和结束日期键入:
function(doc){
var start_time = some_conversion_function(doc.start_time);
var end_time = some_conversion_function(doc.end_time);
emit([start_time, end_time], doc_id);
}
如果您有关于开始时间和结束时间之间的最大差异的任何更多详细信息,您可以使用它来进一步减少每组中的文档。以下示例将返回不迟于date
前X天且不迟于date
开始并且不迟于date
后X天结束的文档。
..._view/by_start_date?startkey=[date-X,]&endkey=[date, date+X]
您可以对by_end_date视图应用类似的逻辑。