CouchDB 按日期过滤

CouchDB filtering by date

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 天的文件。

我做错了什么?

I want to get documents for device_num = 22 and 21 and whose creation_date has less than 60 days from the present day

英文写法:"I want documents for 21 and 22"其实是"I'll accept any document where the document is for either 21 or 22":

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

因为带有单个 device_num 的文档不能同时用于设备 21 和 22。

世界各地的日期有点乱,谁知道您的用户是否在同一时区? Couchdb 提供 some examples 在日期中考虑整理因素,这里是使用 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 }
  ]
}