Как использовать $ в операторе с парой атрибутов - PullRequest
0 голосов
/ 03 июля 2018

Рассмотрим эту коллекцию

/* 1 */
{
    "key" : 1,
    "b" : 2,
    "c" : 3
}

/* 2 */
{
    "key" : 2,
    "b" : 5,
    "c" : 4
}

/* 3 */
{
    "key" : 3,
    "b" : 7,
    "c" : 9
}

/* 4 */
{
    "key" : 4,
    "b" : 7,
    "c" : 4
}

/* 5 */
{
    "key" : 5,
    "b" : 2,
    "c" : 9
}

Я хочу использовать оператор $ in и написать запрос для возврата документа, такого как (b, c) IN ((2, 3), (7, 9)). Это означает «вернуть все строки, где b равно 2, а c равно 3, ИЛИ b равно 7 и с равно 9 одновременно».

Как использовать оператор $ in для использования нескольких значений атрибута.

Если я использую следующий запрос

db.getCollection('test').find({
    $and:[

           {b:{$in:[2,7]}},
           {c:{$in:[3,9]}}
         ]
    })

тогда я получаю следующие результаты

(2,3)

(7,9)

(2,9) -> Это нежелательная запись.

В мире SQL это возможно ВЫБРАТЬ * ОТ демо ГДЕ (b, c) IN ((2, 3), (7, 9))

Что такое эквивалент в БД Mongo?

1 Ответ

0 голосов
/ 03 июля 2018

Если я правильно понял, то, что вы делаете, это получаете все пары (2,3), (2,9), (7,3), (7,9). Но вы хотите сопоставлять их одно за другим, поэтому ваши действительные пары должны быть (2, 3), (7, 9). Чтобы удовлетворить это, вы можете сопоставлять b и c один за другим, объединять их в пару и "или" после них.

db.getCollection('test').find({
$or: [
       {$and: [ {b : 2}, {c : 3} ]},
       {$and: [ {b : 7}, {c : 9} ]}
     ]
})
...