芒果语法可以在一个查询中使用两个$ OR运算符吗?

时间:2019-05-27 07:37:41

标签: couchdb couchdb-mango

我在将两个$OR操作放在一个查询语句中时遇到问题。它忽略了较早的$OR运算符,只考虑了查询中的最后一个$OR运算符。 (查询中只有一个$OR运算符时没有问题。)我想知道我是否做错了什么,是否可以使用CouchDB实现,或者是否有解决方法。谢谢!

我正在使用CouchDB作为状态数据库在Hyperledger Fabric上运行区块链。 (https://hyperledger-fabric.readthedocs.io/en/release-1.4/couchdb_tutorial.html)我在CouchDB的工作中绝对不是经验丰富的人,所以我可能对它的行为方式略知一二。

这有点复杂,但是我的对象基本上“属于”两个所有者和公司。我要执行查询,以便当我搜索所有者或公司时,它会在两个不同的列中进行搜索以查看所有者/公司是否存在。

例如当我搜索公司A时,它应同时在Company Acompany1_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”}]}

1 个答案:

答案 0 :(得分:1)

是的,它会忽略它,因为它是一个标准的JSON对象,因此每个键都必须是唯一的。您遇到的情况与以下简单示例相同:

{
    "foo": 123,
    "foo": 345,
}

根据您的JSON解析器接受第一个还是最后一个值,您产生的对象将是{ "foo": 123 }{ "foo": 345 }

解决方案是使用另一个逻辑层。在您的情况下,您可能希望$and包装您的$or条件:

"$and": [
    { "$or": [ ... ] },
    { "$or": [ ... ] },
]