Изучаем MongoDB: запросы к Документам — I
Перевод: Paras — Learn MongoDB: Query Documents — I
Чтение или поиск документов — одна из важных операций. В MongoDB есть много вещей, которым мы должны научиться, чтобы находить нужные нам данные. В этом посте я расскажу обо всех типах операторов, которые mongodb может предложить для запроса документов.
Чтобы настроить mongodb, вы можете проверить мою публикацию о начале работы или официальную документацию.
Содержание:
- Методы чтения
- Простой запрос
- Запрос встроенных документов
- Поиск документов с помощью операторов
- Операторы сравнения
- Логические операторы
- Операторы Элементов
Методы чтения
Когда дело доходит до запросов данных, у нас есть два метода чтения.
- find
- findOne
В этом посте мы рассмотрим find, потому что принципы работы с обоими методами одинаковы, с той лишь разницей, что findOne возвращает только первый документ из найденных результатов.
Опять же, мы будем работать с базой данных pokeworld, созданной в предыдущем посте.
Новая структура документа в коллекции pokemons
{ name: "pikachu", type: "Electric", stats: { health: 40, attack: 50, defense: 45 }, level: 16, weakness: "ground", // this field can be empty in some documents evolution: "raichu", moves: [ {name: "quick attack", dmg: 40}, {name: "thunder bolt", dmg: 90}, {name: "irontail", dmg: 50} ] }
Такой структуры документа должно быть достаточно, чтобы помочь нам изучить различные способы запроса данных. Давайте начнем !
Простой запрос
#найти покемонов травяного типа с 20 уровнем > db.pokemons.find({type: "Grass", level: 40}).pretty()
Запрос встроенных документов
Встроенные документы — это объекты внутри документа. Например. stats в нашем документе. Используйте кавычки и . точку для запроса полей во встроенных документах.
# найти электрического покемона со здоровьем 40 > db.pokemons.find({type: "Electric", "stats.health": 40}).pretty()
Pretty () помогает отформатировать документ в оболочке, чтобы результаты были удобочитаемыми.
Поиск документов с помощью операторов
Когда дело доходит до запроса данных более сложным способом, нам нужно больше, чем просто простые запросы. У этого Mongo есть операторы, которые помогают нам создавать более сложные запросы.
Типы операторов:
- Операторы запросов (Используется для поиска данных)
- Операторы проекции (Изменить представление документов)
- Операторы обновления (Используется для обновления или добавления данные в документы)
В этом посте мы рассмотрим только операторы запросов. Нам доступны разные типы операторов.
- Операторы сравнения
- Логические операторы
- Операторы запроса элемента
- Операторы оценочного запроса (в следующем посте)
- Геопространственные операторы (в следующем посте)
- Операторы массивов (в следующем посте)
Операторы сравнения
Когда мы хотим сравнить данные в документах, например, меньше, больше, не равно, мы используем операторы сравнения.
- Операторы:
$eq
,$ne
,$gt
,$gte
,$lt
,$lte
,$in
,$nin
# $eq, равно > db.pokemons.find({$eq: {"name": "pikachu"}}) # $ne (не равно), получить покемонов со здоровьем не равным 40 > db.pokemons.find({"stats.attack": {$ne: 40}}) # $gt (больше), $gte (больше, чем равно), # $lt(less than), $lte(less than equal) > db.pokemons.find({type: "grass", "stats.health": {$gte: 40, $lt: 60}}) # $in (включает), $nin (не включает) # найти покемонов со следующими показателями здоровья: 40, 45, 50 > db.pokemons.find({"stats.health": {$in: [40, 50, 45]}})
Логические операторы
Логические операторы помогают нам строить логические утверждения, например И, ИЛИ, НИ, НЕ
- Операторы:
$and
,$or
,$nor
,$not
$or : Он помогает нам, когда мы хотим, чтобы выполнялось одно из условий. При использовании этого оператора мы передаем 2 или более фильтров в массиве.
$nor : Это полная противоположность $or и может использоваться аналогичным образом для выполнения противоположности $or
# найти покемона с типом grass или electric и health 40 > db.pokemons.find({ health: 40, $or: [ {type: "grass"}, {type: "electric"} ] })
$and: также принимает массив фильтров и проверяет, все ли условия выполняются документом или нет.
# найти покемонов со здоровьем 40 и атакой 60 > db.pokemons.find({ $and: [ {"stats.health": 40}, {"stats.attack": 60} ] })
$not : используется, когда вы хотите инвертировать фильтр, т.е. делать противоположное тому, что делает фильтр..
# найти покемонов с защитой не выше 45 > db.pokemons.find({ "stats.defense": {$not: {$gt: 45}} }) # вы можете использовать оператор $eq с $not для случая "не равно".
Операторы Элементов
Есть два оператора элемента. Они помогают нам работать с полями, а не с данными. Под этим я подразумеваю поля, например поля stats, type в документе о покемонах.
- Операторы:
$exists
,$type
$exists : Поскольку структура документа mongodb не является жесткой и может пропускать некоторые поля в некоторых документах, нам иногда необходимо проверить, существует ли поле в документе или нет. Тогда в действие вступает оператор $ exists.
Если вы проверите пример структуры документа, который я дал в начале, вы увидите, что поле weakness
может быть пустым в некоторых документах, то есть его не существует в некоторых документах (какие-то суперпокемоны без слабых мест: p)
# найти покемонов, у которых есть слабое поле / ключ > db.pokemons.find({ weakness: {$exists: true}})
$type: Этот оператор помогает нам проверить тип поля в документе. Давайте узнаем о всех доступных типах в mongoDB, чтобы мы могли лучше использовать эти операторы. (Я выберу самые важные и наиболее часто используемые. Полный список можно посмотреть здесь)
- Числовые типы Number: «int», «long», «decimal», «double»
- типы Boolean: «bool»
- тип Date: «date», «timestamp»
- Строковый тип String: «string»
- тип Object: «object»
- тип Array: «array»
- Object Id: «objectId»
- тип Null: «null»
- Тип двоичные данные Binary: «binData»
# Допустим, вы вставили покемона в коллекцию # Вместо чисел вы вставили их как строку! # давайте найдем эти документы !! > db.pokemons.find({"stats.health": {$type: "string"}})
По умолчанию при хранении чисел mongodb использует тип «double».
Заключение
Мы узнали много важных и полезных операторов, которые могут понадобиться для запроса данных в mongodb. В следующем посте я расскажу об остальных операторах (операторы вычисления и массивы).
Итак, пока все! Надеюсь, эта статья была вам полезна.