我正在尝试获取字段“ effectiveDateOfAction ”大于2017年10月的记录。请找到以下3条记录。
.*?
请在下面尝试的查询中查找。我正在使用Project Fauxton进行检查。
(\[\/module[^]]*\])
请帮助我获取正确的查询。
答案 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
然后,您还可以使用startkey
和endkey
参数来限制特定的时间范围:
/my-database/_design/employees/_view/by_action_date?include_docs=true&startkey="2018-10-01"&endkey="2018-10-31"
这将返回您的TRAN001
和TRAN002
文档。