我第一次尝试使用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"}}}'