Может ли синтаксис манго принимать два оператора $ OR в одном запросе? - PullRequest
1 голос
/ 27 мая 2019

У меня проблемы с помещением двух операций $OR в одну инструкцию запроса. Он игнорирует более ранние операторы $OR и учитывает только последний оператор $OR в запросе. (Проблема не возникает, когда в запросе присутствует только один оператор $OR.) Интересно, я что-то не так делаю, возможно ли добиться этого с помощью CouchDB или есть ли способ обойти это? Спасибо!

Я запускаю блокчейн на Hyperledger Fabric, используя CouchDB в качестве базы данных состояний. (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"}]}

1 Ответ

1 голос
/ 27 мая 2019

Да, он игнорирует его, потому что это стандартный объект JSON, поэтому каждый ключ должен быть уникальным.У вас такая же ситуация с более простым примером:

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

В зависимости от того, принимает ли ваш анализатор JSON первое или последнее значение, ваш результирующий объект будет { "foo": 123 } или { "foo": 345 }.

Решение состоит в том, чтобы использовать другой логический уровень.В вашем случае вы, вероятно, захотите $and обернуть ваши $or условия:

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