我有一个离子应用程序,它将数据存储在本地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创建一个复杂的过滤器并不难。
我不可能是第一个尝试这样做的人。
感谢您的帮助!
答案 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条记录,之后您需要触发额外的请求以对结果进行分页,同时保持数据库不被修改。