Перейти к основному содержанию

MongoDB

Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Поддержка MongoDB

TypeORM поддерживает базовую работу с MongoDB (драйвер Node.js v7 или новее).

Большая часть функциональности TypeORM ориентирована на РСУБД. На этой странице описаны все возможности, специфичные для MongoDB.

Установка

npm install mongodb

Параметры источника данных

  • appName - Имя приложения, создавшего экземпляр MongoClient. MongoDB записывает это значение в журнал сервера при установке соединения. Также фиксируется в журналах медленных запросов и коллекциях профилирования.

  • authMechanism - Механизм аутентификации MongoDB.

  • authSource - Указывает базу данных, связанную с учётными данными пользователя.

  • autoEncryption - Опционально включает автоматическое шифрование данных при использовании.

  • checkServerIdentity - Проверяет, выдан ли сертификат cert для hostname.

  • compressors - Массив или строка с разделителями-запятыми компрессоров для сжатия сетевого трафика между клиентом и mongod/mongos.

  • connectTimeoutMS - Время ожидания подключения в миллисекундах до таймаута. По умолчанию: 30000.

  • database - Имя базы данных.

  • directConnection - Разрешает драйверу принудительно использовать топологию Single для строки подключения с одним хостом.

  • driver - Объект драйвера. По умолчанию require("mongodb").

  • family - Семейство IP-адресов.

  • forceServerObjectId - Принудительно генерировать _id на сервере вместо драйвера. По умолчанию: false.

  • host - Хост базы данных.

  • hostReplicaSet - Реплика-сет хоста базы данных.

  • ignoreUndefined - Игнорировать поля со значением undefined при BSON-сериализации. По умолчанию: false.

  • localThresholdMS - Размер окна задержки (в миллисекундах) для выбора подходящего экземпляра MongoDB среди нескольких доступных.

  • maxStalenessSeconds - Максимальное отставание вторичной реплики в секундах перед исключением её из операций чтения. Минимум: 90 секунд.

  • minPoolSize - Минимальное количество соединений в пуле подключений.

  • monitorCommands - Включает мониторинг команд для этого клиента.

  • noDelay - Отключает задержку Nagle для TCP-соединений.

  • password - Пароль базы данных.

  • pkFactory - Фабрика кастомных ключей _id.

  • poolSize - Максимальное количество соединений в пуле подключений. Соответствует опции maxPoolSize драйвера MongoDB.

  • port - Порт хоста базы данных. Порт MongoDB по умолчанию: 27017.

  • promoteBuffers - Конвертировать BSON Binary в нативные Node.js Buffer. По умолчанию: false.

  • promoteLongs - Конвертировать Long-значения в number при 53-битной совместимости. По умолчанию: true.

  • promoteValues - Конвертирует значения BSON в нативные типы, где возможно. При false возвращаются типы-обёртки. По умолчанию: true.

  • proxyHost - Хост SOCKS5-прокси для TCP-подключений.

  • proxyPassword - Пароль SOCKS5-прокси при аутентификации по логину/паролю.

  • proxyPort - Порт SOCKS5-прокси для TCP-подключений.

  • proxyUsername - Имя пользователя SOCKS5-прокси при аутентификации по логину/паролю.

  • raw - Возвращать документы как сырые BSON-буферы. По умолчанию: false.

  • readConcern - Уровень гарантий чтения (read concern) для коллекции.

  • readPreference - Предпочитаемая стратегия чтения:

    • ReadPreference.PRIMARY
    • ReadPreference.PRIMARY_PREFERRED
    • ReadPreference.SECONDARY
    • ReadPreference.SECONDARY_PREFERRED
    • ReadPreference.NEAREST
  • readPreferenceTags - Теги для read preference в формате строки "ключ:значение", разделённых запятыми.

  • replicaSet - Имя набора реплик, если mongod является его участником.

  • retryWrites - Включает повторные попытки записи.

  • serializeFunctions - Сериализовывать функции в объектах. По умолчанию: false.

  • socketTimeoutMS - Таймаут операций отправки/получения через сокет в миллисекундах. По умолчанию: 360000.

  • tls - Включает TLS/SSL для подключения. По умолчанию: false.

  • tlsAllowInvalidCertificates - Отключает проверку сертификатов mongod/mongos. По умолчанию: false.

  • tlsCAFile - Путь к локальному .pem-файлу с корневым цепочкой сертификатов центра сертификации.

  • tlsCertificateKeyFile - Путь к локальному .pem-файлу с TLS/SSL-сертификатом и ключом клиента.

  • tlsCertificateKeyFilePassword - Пароль для расшифровки tlsCertificateKeyFile.

  • url - URL подключения. Обратите внимание: другие параметры источника данных имеют приоритет над параметрами, заданными в URL.

  • username - Имя пользователя базы данных.

  • writeConcern - Уровень подтверждения записи (Write Concern), определяющий гарантии фиксации операций в MongoDB.

Дополнительные параметры можно добавить в объект extra, и они будут переданы напрямую в клиентскую библиотеку. Подробнее см. в документации mongodb по Параметрам подключения.

Определение сущностей и столбцов

Определение сущностей и столбцов почти идентично реляционным базам данных. Главное отличие — вместо @PrimaryColumn или @PrimaryGeneratedColumn необходимо использовать @ObjectIdColumn.

Пример простой сущности:

import { ObjectId } from "mongodb"
import { Entity, ObjectIdColumn, Column } from "typeorm"

@Entity()
export class User {
@ObjectIdColumn()
_id: ObjectId

@Column()
firstName: string

@Column()
lastName: string
}

Пример инициализации приложения:

import { DataSource } from "typeorm"

const myDataSource = new DataSource({
type: "mongodb",
host: "localhost",
port: 27017,
database: "test",
})

Определение вложенных документов (embedded documents)

Поскольку MongoDB хранит объекты внутри объектов (или документы внутри документов), в TypeORM можно делать аналогично:

import { ObjectId } from "mongodb"
import { Entity, ObjectIdColumn, Column } from "typeorm"

export class Profile {
@Column()
about: string

@Column()
education: string

@Column()
career: string
}
import { ObjectId } from "mongodb"
import { Entity, ObjectIdColumn, Column } from "typeorm"

export class Photo {
@Column()
url: string

@Column()
description: string

@Column()
size: number

constructor(url: string, description: string, size: number) {
this.url = url
this.description = description
this.size = size
}
}
import { Entity, ObjectId, ObjectIdColumn, Column } from "typeorm"

@Entity()
export class User {
@ObjectIdColumn()
id: ObjectId

@Column()
firstName: string

@Column()
lastName: string

@Column((type) => Profile)
profile: Profile

@Column((type) => Photo)
photos: Photo[]
}

При сохранении этой сущности:

const user = new User()
user.firstName = "Timber"
user.lastName = "Saw"
user.profile = new Profile()
user.profile.about = "About Trees and Me"
user.profile.education = "Tree School"
user.profile.career = "Lumberjack"
user.photos = [
new Photo("me-and-trees.jpg", "Me and Trees", 100),
new Photo("me-and-chakram.jpg", "Me and Chakram", 200),
]

await myDataSource.manager.save(user)

В базе данных сохранится следующий документ:

{
"firstName": "Timber",
"lastName": "Saw",
"profile": {
"about": "About Trees and Me",
"education": "Tree School",
"career": "Lumberjack"
},
"photos": [
{
"url": "me-and-trees.jpg",
"description": "Me and Trees",
"size": 100
},
{
"url": "me-and-chakram.jpg",
"description": "Me and Chakram",
"size": 200
}
]
}

Использование MongoEntityManager и MongoRepository

Доступно большинство методов EntityManager (кроме специфичных для РСУБД, таких как query и transaction). Например:

const timber = await myDataSource.manager.findOneBy(User, {
firstName: "Timber",
lastName: "Saw",
})

Для MongoDB также существует отдельный MongoEntityManager, расширяющий EntityManager.

const timber = await myDataSource.manager.findOneBy(User, {
firstName: "Timber",
lastName: "Saw",
})

Аналогично отдельному MongoEntityManager, существует MongoRepository с расширенным функционалом Repository:

const timber = await myDataSource.getMongoRepository(User).findOneBy({
firstName: "Timber",
lastName: "Saw",
})

Использование расширенных параметров в find():

Равно (Equal):

const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $eq: "Timber" },
},
})

Меньше (LessThan):

const timber = await myDataSource.getMongoRepository(User).find({
where: {
age: { $lt: 60 },
},
})

В диапазоне (In):

const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $in: ["Timber", "Zhang"] },
},
})

Вне диапазона (Not in):

const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $not: { $in: ["Timber", "Zhang"] } },
},
})

Или (Or):

const timber = await myDataSource.getMongoRepository(User).find({
where: {
$or: [{ firstName: "Timber" }, { firstName: "Zhang" }],
},
})

Запросы к вложенным документам

const users = await myDataSource.getMongoRepository(User).find({
where: {
"profile.education": { $eq: "Tree School" },
},
})

Запросы к массиву вложенных документов

// Query users with photos of size less than 500
const users = await myDataSource.getMongoRepository(User).find({
where: {
"photos.size": { $lt: 500 },
},
})

MongoEntityManager и MongoRepository содержат множество полезных методов, специфичных для MongoDB:

createCursor

Создает курсор для запроса, который можно использовать для итерации по результатам из MongoDB.

createEntityCursor

Создает курсор для запроса, который можно использовать для итерации по результатам из MongoDB. Возвращает модифицированную версию курсора, преобразующую каждый результат в модели сущностей.

aggregate

Выполняет конвейер агрегации для коллекции.

bulkWrite

Выполняет операцию bulkWrite без использования fluent API.

count

Подсчитывает количество соответствующих запросу документов в базе данных.

countDocuments

Подсчитывает количество соответствующих запросу документов в базе данных.

createCollectionIndex

Создает индекс в базе данных для коллекции.

createCollectionIndexes

Создает несколько индексов в коллекции. Спецификации индексов определяются в createIndexes.

deleteMany

Удаляет несколько документов в MongoDB.

deleteOne

Удаляет один документ в MongoDB.

distinct

Команда distinct возвращает список уникальных значений для указанного ключа в коллекции.

dropCollectionIndex

Удаляет индекс из коллекции.

dropCollectionIndexes

Удаляет все индексы коллекции.

findOneAndDelete

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

findOneAndReplace

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

findOneAndUpdate

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

geoHaystackSearch

Выполняет геопоиск с использованием индекса geo haystack в коллекции.

geoNear

Выполняет команду geoNear для поиска элементов в коллекции.

group

Выполняет команду group для группировки данных в коллекции.

collectionIndexes

Возвращает все индексы коллекции.

collectionIndexExists

Проверяет существование индекса в коллекции.

collectionIndexInformation

Возвращает информацию об индексах коллекции.

initializeOrderedBulkOp

Инициирует упорядоченную групповую операцию записи: операции выполняются последовательно в порядке добавления, создавая новую операцию при смене типа.

initializeUnorderedBulkOp

Инициирует неупорядоченную групповую операцию записи: все операции буферизуются в команды insert/update/remove и выполняются в произвольном порядке.

insertMany

Вставляет массив документов в MongoDB.

insertOne

Вставляет один документ в MongoDB.

isCapped

Проверяет, является ли коллекция capped-коллекцией.

listCollectionIndexes

Возвращает список всей информации об индексах коллекции.

parallelCollectionScan

Возвращает N параллельных курсоров для коллекции, позволяя параллельное чтение всей коллекции без гарантий порядка результатов.

reIndex

Переиндексирует все индексы коллекции. Внимание: reIndex - блокирующая операция (индексы перестраиваются на переднем плане) и может быть медленной для больших коллекций.

rename

Изменяет имя существующей коллекции.

replaceOne

Заменяет документ в MongoDB.

updateMany

Обновляет несколько документов в коллекции на основе фильтра.

updateOne

Обновляет один документ в коллекции на основе фильтра.