Базы данных

Изучаем 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
Editorial Team

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

12 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

12 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago