CouchDB搜索多个字段



我第一次尝试使用CouchDB 3.1。我正在尝试做一个动态查询,其中可以搜索多个字段,这是完全可选的。我的数据示例:

{
"_id": "464e9db4d9216e1621b354794a0181d4",
"_rev": "1-fade491c3e255bbbfa60f1d7462fa9a2",
"app_id": "0000001",
"username": "john@gmail.com",
"transaction": "registration",
"customer_name": "John Doe",
"status": "complete",
"request_datetime": "2020-01-31 12:05:00"
}

所以我想做的是,这些文件可以通过";交易"交易";以及";app_id";,或字段"的组合;app_id"/"用户名"/"交易"/"用户名"/"状态"/"request_datetime";基于来自用户的搜索输入。(诸如"app_id"之类的字段中的一些字段可能基于"transaction"为空(

我已经尝试通过";app_id";以及";交易":

function (doc) {
if(doc.transaction && doc.app_id) {
emit([doc.transaction, doc.app_id], doc);
}
}

但当app_id本身为null时,由于CouchDB中的键是索引,这将不起作用。

所以我的问题是,在不使用GeoCouch或Lucene的情况下,使用vanilla CouchDB是否可以实现这一点?我是否需要根据不同的搜索字段组合做出不同的视图?

非常感谢您的帮助。非常感谢。

使用/db/_find,可以定义一个接受组合运算符和条件运算符的选择器。这使您可以创建简单和非常复杂的查询。考虑到您的文档结构,这样的选择器可能如下所示。

"selector":{
"$and":[
{
"app_id":{
"$eq":"0000001"
}
},
{
"username":{
"$eq":"john@gmail.com"
}
},
{
"request_datetime": {
"$gte": "2020-01-31 12:00:00",
"$lt": "2020-01-31 13:00:00"
} 
}         
]
}

$eq$exists组合的$or运算符可以用于检查可以是null的字段。$regex操作员为您提供了更多的动力。

下面是一个使用CURL(替换为数据库名称(的简单示例。

curl -H 'Content-Type: application/json' -X POST http://localhost:5984/<db>/_find -d '{"selector":{"username":{"$eq": "john@gmail.com"}}}'

最新更新