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
Ответы
Ответ 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"
})