Подтвердить что ты не робот

Mongodb запрашивает как AND, так и OR

Можно ли использовать комбинацию OR и AND в запросах mongodb?

приведенный ниже код не работает должным образом

db.things.find({
           $and:[
                {$or:[
                     {"first_name" : "john"}, 
                     {"last_name" : "john"}
                ]},
                {"phone": "12345678"}
            ]});

содержимое базы данных:

> db.things.find();
{ "_id" : ObjectId("4fe8734ac27bc8be56947d60"), "first_name" : "john", "last_name" : "hersh", "phone" : "2222" }
{ "_id" : ObjectId("4fe8736dc27bc8be56947d61"), "first_name" : "john", "last_name" : "hersh", "phone" : "12345678" }
{ "_id" : ObjectId("4fe8737ec27bc8be56947d62"), "first_name" : "elton", "last_name" : "john", "phone" : "12345678" }
{ "_id" : ObjectId("4fe8738ac27bc8be56947d63"), "first_name" : "eltonush", "last_name" : "john", "phone" : "5555" }

при запросе вышеуказанного запроса - я ничего не получаю!

> db.things.find({$and:[{$or:[{"first_name" : "john"}, {"last_name" : "john"}]},{"phone": "12345678"}]});
>

Я использую mongo 1.8.3

4b9b3361

Ответ 1

Я верю $и поддерживается только в MongoDB v2.0+. Я удивлен, что консоль приняла выражение в первую очередь. Я попытаюсь воссоздать против сервера 1.8, который у меня есть.

Также проверьте 10Gen Advanced Query Documentation для $and.

Update

Я ввел ваши образцы данных на сервер MongoDB v1.8x и v2.0x. Запрос работает на v2.0x и не работает на v1.8x. Это подтверждает мои подозрения (и Miikka), что проблема связана с $and и версией вашего сервера.

Я нашел (возможно) умное обходное решение для этого в Интернете здесь. Надеюсь, это поможет.

-SethO

Ответ 2

 db.things.find( {
      $and : [
               { 
                 $or : [ 
                         {"first_name" : "john"},
                         {"last_name" : "john"}
                       ]
               },
               { 
                 "Phone":"12345678"
               }
             ]
    } )

И берет массив из двух выражений ИЛИ, телефона.
ИЛИ принимает массив из двух выражений first_name, last_name.

А ТАКЖЕ

  • ИЛИ ЖЕ

    • имя
    • Фамилия
  • Номер телефона.

Примечание. Обновите до последней версии MongoDB, если это не сработает.

Ответ 3

Это возможно следующим образом (mongodb 3.4)

Вот хороший пример

https://docs.mongodb.com/manual/reference/operator/query/and/#and-queries-with-multiple-expressions-specifying-the-same-operator

        db.getCollection('tbl_menu_items').find({
        $and : [
            { $or : [ { price : 0.99 }, { price : 1.99 } ] },
            { $or : [ { sale : true }, { qty : { $lt : 20 } } ] }
        ]
    } )

Этот запрос выберет все документы, где:

значение поля цены равно 0.99 или 1.99, а значение поля продажи равно true или значение поля qty меньше 20.

Вот пример $ и условия с $ или запросом, то есть соответствие любому из условий, например

рассмотрите следующий запрос...


        db.getCollection('tbl_menu_items').find(

        { '$or': 
           [ { '$and': 
                [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553")  ] } },
                  { is_ryward: 1 },
                  { points_reqiured_to_redeem_reward: { '$lte': 500 } } ] },
             { '$and': 
                [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553")  ] } },
                  { is_freebie: 1 } ] } ] }
        )



Этот запрос выберет все документы, где:

в массиве 588054c63879f2e767a1d553 и is_ryward = 1 и points_reqiured_to_redeem_reward <500

Или же

в массиве 588054c63879f2e767a1d553 и is_freebie

Ответ 4

Короче использовать неявную операцию И:

db.things.find({
    $or : [ 
        {"first_name": "john"},
        {"last_name": "john"}
    ],
    "phone": "12345678"         
})