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

MongoDB

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

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

Поддержка MongoDB

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

Установка

npm install mongodb

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

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

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

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

  • username - Имя пользователя БД (альтернатива auth.user).

  • password - Пароль базы данных (альтернатива auth.password).

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

  • poolSize - Максимальный размер пула соединений для каждого сервера или прокси.

  • tls - Использовать TLS/SSL-соединение (требует сервер mongod с поддержкой ssl, версия 2.4+). По умолчанию: false.

  • tlsAllowInvalidCertificates - Разрешать невалидные TLS-сертификаты сервера. По умолчанию: false.

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

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

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

  • keepAlive - Задержка в миллисекундах перед активацией keepAlive на TCP-сокете. По умолчанию: 30000.

  • connectTimeoutMS - Таймаут TCP-подключения. По умолчанию: 30000.

  • socketTimeoutMS - Таймаут TCP-сокета. По умолчанию: 360000.

  • replicaSet - Имя набора реплик для подключения.

  • authSource - База данных для аутентификации, если отличается от текущей.

  • writeConcern - Параметр гарантии записи (write concern).

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

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

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

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

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

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

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

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

    • ReadPreference.PRIMARY
    • ReadPreference.PRIMARY_PREFERRED
    • ReadPreference.SECONDARY
    • ReadPreference.SECONDARY_PREFERRED
    • ReadPreference.NEAREST
  • pkFactory - Фабрика кастомных ключей _id.

  • readConcern - Гарантия чтения для коллекции (требует MongoDB 3.2+).

  • maxStalenessSeconds - Максимальное устаревание для чтения со вторичных реплик (минимум 90 секунд).

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

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

  • directConnection - Определяет, следует ли принудительно направлять все операции на указанный хост.

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

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

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

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

import { Entity, ObjectId, 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 { Entity, ObjectId, ObjectIdColumn, Column } from "typeorm"

export class Profile {
@Column()
about: string

@Column()
education: string

@Column()
career: string
}
import { Entity, ObjectId, 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[]
}

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

import { getMongoManager } from "typeorm"

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),
]

const manager = getMongoManager()
await 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

Создает несколько индексов в коллекции. Поддерживается только в MongoDB 2.6 и выше. В более ранних версиях вызывает ошибку "command not supported". Спецификации индексов определены в 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.

stats

Возвращает всю статистику коллекции.

updateMany

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

updateOne

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