【问题标题】:Creating complex filters with CouchDB使用 CouchDB 创建复杂的过滤器
【发布时间】:2016-11-21 15:28:21
【问题描述】:

我有一个 ionic 应用程序,它将数据存储在其本地 PouchDB 中。

我的数据库存储像这个例子这样的文档:

{
    Timestamp: "2016-11-17T09:35:06",
    Category: "CAT_1",
    Place: "House",
    ...
    Responsible: "Foo Bar",
    ...
},
{
    Timestamp: "2016-11-07T18:45:11",
    CategoryCode: "CAT_2",
    Place: "Apartment",
    ...
    Responsible: "Bar Foo",
    ...
}

我的 ionic 应用需要一个过滤屏幕,用户可以在其中选择任何/所有这 4 个字段并将其应用于过滤。

所以我的应用用户只能选择Timestamp 来搜索特定日期的货币。他可以通过单个Category 等选择过滤器。

他可以创建这 4 个元素的任意组合,例如:

[Timestamp,Category]
[Timestamp,Place]
[Category,Place]
[Timestamp,Responsible]
...

我总是必须按Timestamp 反向排序,但这不是问题。

问题是我找不到任何可以提供这种灵活性的 Map 函数...

我知道如果用户必须填写所有过滤器,我可以轻松使用此 Map 功能:

map: 
function (doc) {
    emit([Timestamp,Category,Place,Responsible], doc.Name);
}

有了这个,我知道我可以查询这种可能性:

[Timestamp,{}]
[Timestamp,Category,{}]
[Timestamp,Category,Place,{}]
[Timestamp,Category,Place,Responsible]

但我不能只过滤 [Place,Responsible],因为 CouchDB/PouchDB 不允许我将通配符放在左边,比如 [{},{},Place,Responsible],只能放在右边,就像我之前展示的那样。

我知道我可以为每种可能性创建一个地图,但是今天我们有 四个 过滤器,明天可能是

你们中的一些人能告诉我我可以做些什么来掩盖它吗?

我知道我的 SQL 背景应该让我走错方向,但我想用 NoSQL 特别是 CouchDB/PouchDB 创建一个复杂的过滤器不会那么难。

我不可能是第一个尝试这样做的人。

感谢您的帮助!

【问题讨论】:

    标签: angularjs ionic-framework couchdb pouchdb nosql


    【解决方案1】:

    我不认为有办法在 Couchdb 中进行这样的过滤,因为在其他 NoSQL 数据库中没有办法这样做。即使对于 SQL 数据库,如果您在 [Timestamp,Category,Place,Responsible] 上有索引,您也不能使用它来搜索 [{},{},Place,Responsible]

    您可以考虑对 couchdb 使用全时搜索,您可以在其中指定字段的任意组合以按任意顺序进行搜索: https://github.com/cloudant-labs/clouseau https://github.com/cloudant-labs/dreyfus

    这里需要注意的是,搜索仅检索前 200 条记录,之后您需要触发额外的请求以对结果进行分页,同时保持数据库未修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多