1

$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_idcompany2_id

查询语句:

{"selector":{"docType":"object", "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" }}, "排序": [{"object_id": "desc"}]}

预期:获取与上述查询对应的结果

发生了什么:我得到忽略第一个查询的结果,因此它返回与以下查询相对应的结果:

{"selector":{"docType":"object", "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"}}, “排序”:[{“object_id”:“desc”}]}

4

1 回答 1

1

是的,它忽略了它,因为它是一个标准的 JSON 对象,所以每个键都必须是唯一的。你有一个更简单的例子同样的情况:

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

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

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

"$and": [
    { "$or": [ ... ] },
    { "$or": [ ... ] },
]
于 2019-05-27T08:05:56.073 回答