CouchDB 按日期过滤



Android使用CouchDBCouchBase Lite时,我正在尝试复制数据库,我也使用过滤器来获取具有名称为device_number字段的文档 所以我有这个过滤器:

"1": "function(doc, req) {
if(doc.ismaster || doc._deleted)
return false; 
if( 1 == doc.device_num || 22 == doc.device_num || 25 == doc.device_num || 41 == doc.device_num )
return true;
else 
return false;}", 

它运行良好,我得到了设备的所有文档:1、2、25、41。
好吧,现在我想获取 device_num = 22 和 21 的文档,并且其creation_date距离今天不到 60 天,所以我这样做:

"1": "function(doc, req) {
if(doc.ismaster || doc._deleted)
return false; 
if( 22 == doc.device_num && 21 == doc.device_num && (Math.ceil((new Date(Date.now()).getTime() - new Date(doc.creation_date.split('/')[2], doc.creation_date.split('/')[1] - 1, doc.creation_date.split('/')[0]).getTime()) / (1000 * 3600 * 24)) <= 60) )
return true;
else 
return false;}", 

但我没有得到结果,0 个文档,并且不正确,因为在数据库中有少于 60 天的文档。

我做错了什么?

我想获取 device_num = 22 和 21 以及其的文档 creation_date距离现在不到 60 天

英文措辞:"我想要 2122 的文件"实际上是"我将接受任何文件是 2122 的文件":

if( (22 == doc.device_num || 21 == doc.device_num) && ...)

因为没有具有单个device_num的文档可以同时用于设备21和22。

世界各地的日期有点混乱,谁知道你的用户是否在同一时区?Couchdb 提供了一些在日期中考虑排序规则因素的示例,下面是使用number类型进行安全排序的示例:

// creation:
{tstamp:+new Date(), device_num:22, ...}
// test
validstamp = +new Date() - 1000*60*60*24*60;
if( (22 == doc.device_num || 21 == doc.device_num) && Number(doc.tstamp) > validstamp)
...

最好使用Number()以防存储中出现问题并且您存储了一个字符串。但作为数字,它们在逻辑上是连续的,在 1980 年代初和遥远的未来没有非零填充字符串的奇怪之处,您以后可以重构为使用芒果索引:

{
"tstamp": {'$gt':validstamp},
"$or": [
{ "device_num": 21 },
{ "device_num": 22 }
]
}  

最新更新