我在将两个$OR
操作放在一个查询语句中时遇到问题。它忽略了较早的$OR
运算符,只考虑了查询中的最后一个$OR
运算符。 (查询中只有一个$OR
运算符时没有问题。)我想知道我是否做错了什么,是否可以使用CouchDB实现,或者是否有解决方法。谢谢!
我正在使用CouchDB作为状态数据库在Hyperledger Fabric上运行区块链。 (https://hyperledger-fabric.readthedocs.io/en/release-1.4/couchdb_tutorial.html)我在CouchDB的工作中绝对不是经验丰富的人,所以我可能对它的行为方式略知一二。
这有点复杂,但是我的对象基本上“属于”两个所有者和公司。我要执行查询,以便当我搜索所有者或公司时,它会在两个不同的列中进行搜索以查看所有者/公司是否存在。
例如当我搜索公司A时,它应同时在Company A
和company1_id
中搜索company2_id
。
查询语句:
{“选择器”:{“ docType”:“对象”,“ owner_id”:{“ $ in”:[“ owner_id”]}, “ $ or”:[{“ company1_id”:{“ $ in”:[“ company_id_1”,“ company_id_2”]}}, {“ company2_id”:{“ $ in”:[“ company_id_1”,“ company_id_2”]}}]],“ $ or”: [{“ owner1_id”:{“ $ in”:[“ owner_id_1”,“ owner_id_2”]}},{“ owner2_id”: {“ $ in”:[“ owner_id_1”,“ owner_id_2”]}}], “ object_id”:{“ $ lt”:“ 99999999999”}},“ sort”:[{“ object_id”:“ desc”}]}
期望:获取与上述查询相对应的结果
发生了什么:我得到的结果忽略了第一个查询,因此它返回的结果与以下查询相对应:
{“选择器”:{“ docType”:“对象”,“ owner_id”:{“ $ in”:[“ owner_id”]}, “ $ or”:[{“ owner1_id”:{“ $ in”:[“ owner_id_1”,“ owner_id_2”]}}, {“ owner2_id”:{“ $ in”:[“ owner_id_1”,“ owner_id_2”]}}]], “ object_id”:{“ $ lt”:“ 99999999999”}},“ sort”:[{“ object_id”:“ desc”}]}
答案 0 :(得分:1)
是的,它会忽略它,因为它是一个标准的JSON对象,因此每个键都必须是唯一的。您遇到的情况与以下简单示例相同:
{
"foo": 123,
"foo": 345,
}
根据您的JSON解析器接受第一个还是最后一个值,您产生的对象将是{ "foo": 123 }
或{ "foo": 345 }
。
解决方案是使用另一个逻辑层。在您的情况下,您可能希望$and
包装您的$or
条件:
"$and": [
{ "$or": [ ... ] },
{ "$or": [ ... ] },
]