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.PRIMARYReadPreference.PRIMARY_PREFERREDReadPreference.SECONDARYReadPreference.SECONDARY_PREFERREDReadPreference.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.