使用CouchDB创建复杂的过滤器

时间:2016-11-21 15:28:21

标签: angularjs ionic-framework couchdb pouchdb nosql

我有一个离子应用程序,它将数据存储在本地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",
    ...
}

我的离子应用程序需要一个过滤器屏幕,用户可以在其中选择这四个字段中的任何一个/全部并将其应用于过滤。

因此,我的应用用户只能选择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创建一个复杂的过滤器并不难。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

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

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