【问题标题】:CouchDB search by keyword and filter by date at a same timeCouchDB 按关键字搜索并同时按日期过滤
【发布时间】:2016-04-16 05:19:20
【问题描述】:

我有包含日期​​和姓名字段的文档

{
  date: '2015-07-16T09:18:36.660Z',
  name: 'australia'
},
{
  date: '2015-08-12T19:11:11.320Z',
  name: 'austria'
},
{
  date: '2016-01-14T12:59:26.120Z',
  name: 'italy'
},
{
  date: '2019-04-28T17:42:10.520Z',
  name: 'spain'
}
    

我的地图功能是这样的

function(doc) {
  emit(doc.date, doc);
}

我可以使用 ?startkey="2015-01-01T00:00:00Z"&endkey="2017-09-01T00:00:00Z" 指定日期范围,这样可以,但我也想通过关键字搜索指定的日期范围,假设除了上述范围之外,我想要所有名称以“au”开头的项目

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    我认为这在 CouchDB 当前 1.6 中是不可能的。

    blog post 中描述了 Jamie Talbot 制作的补丁,CouchDB's JIRA 中有更多讨论,最终解决方案仅适用于 2.0,实现了您的要求。

    此外,为 CouchDB 创建了一个新的 query language,作为官方的 Cloudant Query 语言,也将在 CouchDB 2.0 中使用。

    也就是说,如果使用 Cloudant 或 CouchDB 2.0,我建议使用更好的查询语言。

    首先您应该创建索引,POST将索引描述写入_index 端点:

    {
      "index": {
        "fields": [
          "date",
          "name"
        ]
      },
      "type": "json"
    }
    

    然后您可以使用新的查询 API,POSTing JSON 到 _find 端点。一个带有您要求的标准的示例:

    {
      "selector": {
        "date": {
          "$gt": "2015-01-01T00:00:00Z",
          "$lt": "2017-09-01T00:00:00Z"
        },
        "name": {
          "$gt": "au",
          "$lt": "au\ufff0"
        }
      }
    }
    

    它在datename 选择器周围隐式使用$and。您可以在上面的链接中找到更多文档。

    【讨论】:

      【解决方案2】:

      您需要将视图函数修改为类似,

      function(doc) {
          emit([doc.date, doc.name], null);
      }
      

      然后你可以做类似的事情,

      startkey=["2015-01-01T00:00:00Z,"au"]&endkey=["2017-09-01T00:00:00Z","au\ufff0"]
      

      当然,您需要对这些键值进行 json 编码。

      【讨论】:

      • 这行不通,因为 CouchDB 从左到右匹配键,所以这将跳过第二个键“au”。如果在日期范围内,任何国家/地区都会匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2012-02-29
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2019-12-13
      • 2012-03-30
      相关资源
      最近更新 更多