Couch DB查询以获取大于特定日期的记录

时间:2018-11-20 07:24:10

标签: couchdb couchdb-mango fauxton

我正在尝试获取字段“ effectiveDateOfAction ”大于2017年10月的记录。请找到以下3条记录。

.*?

请在下面尝试的查询中查找。我正在使用Project Fauxton进行检查。

(\[\/module[^]]*\])

请帮助我获取正确的查询。

2 个答案:

答案 0 :(得分:0)

由于JSON中没有本地日期类型,因此以在查询时有意义的格式存储日期非常重要。当为美国受众群体呈现日期时,“月-日-年”格式可能会很有用,但查询的意义不大。

我建议使用“ YYYY-MM-DD”格式,例如“ 2018-10-30”。这样可以存储与以前相同的数据,但排序顺序恰好是按日期顺序排列,因为年份长于几个月,而月份长于几天。

然后您可以使用“ $ gte”运算符来查询:

{
  "selector": {
    "effectiveDateOfAction": {
      "$gte": "2018-10-01"
     }
  }
}

读取为“获取'有效日期行动'字段大于或等于2018年10月1日的文档”。

有关如何在CouchDB中存储和查询日期的信息,请参见this blog post

答案 1 :(得分:0)

如格林·伯德(Glyn Bird)所说,请尽可能将日期格式更改为可排序形式。我建议使用ISO_8601,这是JSON首选的格式(例如Javascript Date.toJSON)。

如果您无法更改数据,则可以创建一个视图,该视图将日期转换为可排序的格式。

示例:将类似于以下内容的设计文档放入数据库中

{
  _id: '_design/employees',
  views: {
    by_action_date: {
      map: "function (doc) {\n        if (doc.effectiveDateOfAction && doc.employeeName) { // filter for employee docs\n          var dt = doc.effectiveDateOfAction.split('-'); // parse your date format\n          emit(`${dt[2]}-${dt[1]}-${dt[0]}`); // emit iso date as key\n        }\n      }"
    }
  }
}

map函数必须在文档中以字符串形式给出,其格式为:

function(doc) {
    if (doc.effectiveDateOfAction && doc.employeeName) { // filter for employee docs
      var dt = doc.effectiveDateOfAction.split('-'); // parse your date format
      emit(`${dt[2]}-${dt[1]}-${dt[0]}`); // emit iso date as key
    }
  }

然后您可以对其进行查询以对您的员工进行排序:
使用include_docs = true参数将您的真实文档包括在内。

/my-database/_design/employees/_view/by_action_date?include_docs=true

然后,您还可以使用startkeyendkey参数来限制特定的时间范围:

/my-database/_design/employees/_view/by_action_date?include_docs=true&startkey="2018-10-01"&endkey="2018-10-31"

这将返回您的TRAN001TRAN002文档。