Изучаем MongoDB: запросы к Документам – I

Spread the love

Перевод: ParasLearn 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. В следующем посте я расскажу об остальных операторах (операторы вычисления и массивы).

Итак, пока все! Надеюсь, эта статья была вам полезна.

Была ли вам полезна эта статья?
[5 / 4]

Spread the love
Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments