IBM Bluemix中Cloudant查询问题:无法按Date对象排序
当然可以按日期排序啦!你遇到的报错是因为Cloudant无法自动推断createdAt字段的排序类型,而你尝试的:string并不是针对日期场景的正确指定方式——虽然ISO8601格式的字符串按字典序排序结果和时间顺序一致,但我们可以用更准确的日期类型来实现排序,同时提升索引性能。
下面是具体的解决步骤:
1. 先创建正确类型的索引
Cloudant的排序依赖对应的索引支持,所以首先要为createdAt字段创建一个日期类型的索引。你可以用API或者Cloudant Dashboard来创建:
用API创建索引的示例(Node.js为例):
db.createIndex({ index: { fields: [{"createdAt": "datetime"}] // 指定字段类型为datetime }, name: "createdAt-date-sort-index", type: "json" })
用Cloudant Dashboard创建:
进入你的数据库 → 点击"Indexes" → 点击"Create index" → 在字段配置里,选择createdAt字段,类型选择"Date/Time",然后保存即可。
2. 编写正确的查询语句
创建好索引后,就可以在查询里直接按日期排序了,不需要额外加:string,直接指定排序方向即可:
JSON格式的查询示例:
{ "selector": { // 这里写你的查询条件,比如 {"status": "active"} }, "sort": [{"createdAt": "desc"}] // desc是降序,asc是升序 }
如果是用URL参数的方式,也可以明确指定类型(可选,因为索引已经定义了类型):?selector={"status":"active"}&sort=[{"createdAt":"desc"}]
为什么之前的:string没解决问题?
其实加上:string后报错应该会消失,但它是把日期当作普通字符串来排序——虽然你的ISO8601格式字符串排序结果和时间顺序一致,但这并不是针对日期的最优方案。用:datetime的话,Cloudant会真正按日期时间的逻辑来处理排序,索引效率更高,也更符合你的业务意图。
另外要注意:确保你的createdAt字段值是标准的ISO8601格式(就像你给出的"2018-05-03T08:29:53.875Z"),Cloudant才能正确解析为datetime类型。
内容的提问来源于stack exchange,提问作者Victor

