# MongoDB
- MongoDB support
- Defining entities and columns
- Defining subdocuments (embed documents)
- Using
MongoEntityManager
andMongoRepository
# MongoDB support
TypeORM has basic MongoDB support. Most of TypeORM functionality is RDBMS-specific, this page contains all MongoDB-specific functionality documentation.
# Defining entities and columns
Defining entities and columns is almost the same as in relational databases,
the main difference is that you must use @ObjectIdColumn
instead of @PrimaryColumn
or @PrimaryGeneratedColumn
.
Simple entity example:
import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm"
@Entity()
export class User {
@ObjectIdColumn()
id: ObjectID
@Column()
firstName: string
@Column()
lastName: string
}
2
3
4
5
6
7
8
9
10
11
12
13
And this is how you bootstrap the app:
import { DataSource } from "typeorm"
const myDataSource = new DataSource({
type: "mongodb",
host: "localhost",
port: 27017,
database: "test",
})
2
3
4
5
6
7
8
# Defining subdocuments (embed documents)
Since MongoDB stores objects and objects inside objects (or documents inside documents) you can do the same in TypeORM:
import { Entity, ObjectID, ObjectIdColumn, Column } from "typeorm"
export class Profile {
@Column()
about: string
@Column()
education: string
@Column()
career: string
}
2
3
4
5
6
7
8
9
10
11
12
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
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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[]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
If you save this entity:
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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Following document will be saved in the database:
{
"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
}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Using MongoEntityManager
and MongoRepository
You can use the majority of methods inside the EntityManager
(except for RDBMS-specific, like query
and transaction
).
For example:
const timber = await myDataSource.manager.findOneBy(User, {
firstName: "Timber",
lastName: "Saw",
})
2
3
4
For MongoDB there is also a separate MongoEntityManager
which extends EntityManager
.
const timber = await myDataSource.manager.findOneBy(User, {
firstName: "Timber",
lastName: "Saw",
})
2
3
4
Just like separate like MongoEntityManager
there is a MongoRepository
with extended Repository
:
const timber = await myDataSource.getMongoRepository(User).findOneBy({
firstName: "Timber",
lastName: "Saw",
})
2
3
4
Use Advanced options in find():
Equal:
const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $eq: "Timber" },
},
})
2
3
4
5
LessThan:
const timber = await myDataSource.getMongoRepository(User).find({
where: {
age: { $lt: 60 },
},
})
2
3
4
5
In:
const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $in: ["Timber", "Zhang"] },
},
})
2
3
4
5
Not in:
const timber = await myDataSource.getMongoRepository(User).find({
where: {
firstName: { $not: { $in: ["Timber", "Zhang"] } },
},
})
2
3
4
5
Or:
const timber = await myDataSource.getMongoRepository(User).find({
where: {
$or: [{ firstName: "Timber" }, { firstName: "Zhang" }],
},
})
2
3
4
5
Querying subdocuments
const users = await myDataSource.getMongoRepository(User).find({
where: {
"profile.education": { $eq: "Tree School" },
},
})
2
3
4
5
Querying Array of subdocuments
// Query users with photos of size less than 500
const users = await myDataSource.getMongoRepository(User).find({
where: {
"photos.size": { $lt: 500 },
},
})
2
3
4
5
6
Both MongoEntityManager
and MongoRepository
contain lot of useful MongoDB-specific methods:
# createCursor
Creates a cursor for a query that can be used to iterate over results from MongoDB.
# createEntityCursor
Creates a cursor for a query that can be used to iterate over results from MongoDB. This returns a modified version of the cursor that transforms each result into Entity models.
# aggregate
Execute an aggregation framework pipeline against the collection.
# bulkWrite
Perform a bulkWrite operation without a fluent API.
# count
Count number of matching documents in the db to a query.
# createCollectionIndex
Creates an index on the db and collection.
# createCollectionIndexes
Creates multiple indexes in the collection, this method is only supported in MongoDB 2.6 or higher. Earlier version of MongoDB will throw a command not supported error. Index specifications are defined at http://docs.mongodb.org/manual/reference/command/createIndexes/.
# deleteMany
Delete multiple documents on MongoDB.
# deleteOne
Delete a document on MongoDB.
# distinct
The distinct command returns a list of distinct values for the given key across a collection.
# dropCollectionIndex
Drops an index from this collection.
# dropCollectionIndexes
Drops all indexes from the collection.
# findOneAndDelete
Find a document and delete it in one atomic operation, requires a write lock for the duration of the operation.
# findOneAndReplace
Find a document and replace it in one atomic operation, requires a write lock for the duration of the operation.
# findOneAndUpdate
Find a document and update it in one atomic operation, requires a write lock for the duration of the operation.
# geoHaystackSearch
Execute a geo search using a geo haystack index on a collection.
# geoNear
Execute the geoNear command to search for items in the collection.
# group
Run a group command across a collection.
# collectionIndexes
Retrieve all the indexes on the collection.
# collectionIndexExists
Retrieve if an index exists on the collection
# collectionIndexInformation
Retrieves this collections index info.
# initializeOrderedBulkOp
Initiate an In order bulk write operation, operations will be serially executed in the order they are added, creating a new operation for each switch in types.
# initializeUnorderedBulkOp
Initiate a Out of order batch write operation. All operations will be buffered into insert/update/remove commands executed out of order.
# insertMany
Inserts an array of documents into MongoDB.
# insertOne
Inserts a single document into MongoDB.
# isCapped
Returns if the collection is a capped collection.
# listCollectionIndexes
Get the list of all indexes information for the collection.
# mapReduce
Run Map Reduce across a collection. Be aware that the inline option for out will return an array of results not a collection.
# parallelCollectionScan
Return N number of parallel cursors for a collection allowing parallel reading of entire collection. There are no ordering guarantees for returned results
# reIndex
Reindex all indexes on the collection Warning: reIndex is a blocking operation (indexes are rebuilt in the foreground) and will be slow for large collections.
# rename
Changes the name of an existing collection.
# replaceOne
Replace a document on MongoDB.
# stats
Get all the collection statistics.
# updateMany
Updates multiple documents within the collection based on the filter.
# updateOne
Updates a single document within the collection based on the filter.