Чтобы обрабатывать реляционные данные в MongoDB, вам нужно воспользоваться функцией DBrefs
.
Я беру этот пример прямо из одного из моих производственных проектов.
Схема сильно урезана, но все еще рассказывает историю функции DBrefs
.
Она состоит из двух схем: активность и пользователь
Схема действия здесь:
/*eslint-env node*/
//Dependencies
const mongoose = require('mongoose');
//Global Constant
const Schema = mongoose.Schema;
// Create Schema
const ActivitySchema = new Schema({
activity: {
type: String,
},
description: {
type: String,
},
intensity: {
type: String,
},
hostId: {
type: Schema.Types.ObjectId,
ref: 'user'
},
}, {
collection: 'Activity'
});
mongoose.model('activity', ActivitySchema);
Схема пользователя здесь:
/*eslint-env node*/
//Dependencies
const mongoose = require('mongoose');
//Global Constant
const Schema = mongoose.Schema;
//Create Schema
const UserSchema = new Schema({
name: {
type: String,
},
nickName: {
type: String
},
email: {
type: String,
},
password: {
type: String,
},
profImage: {
type: String,
},
interests: {
type: Array,
},
}, {
collection: 'User'
});
mongoose.model('user', UserSchema);
Как видите, есть поле с именем hostId
в конец схемы действия с типом Schema.Types.ObjectId
и полем ref:
, которое указывает на пользовательскую схему.
По сути, это фактически связывает два документа вместе, сохраняя ObjectId
пользователя в коллекции действий (называемой таблицей в SQL).
Эти два документа фактически связаны друг с другом только тогда и только тогда, когда функция запроса, например, .findOne()
вызывается вместе с .populate()
оператор агрегирования.
Пример:
//Syntax: database.collection.queryFunction
//Normal Query:
db.activity.findOne({activity:'stack overflow event`})
.then(activityData=>{
console.log(activityData);
//You will get something like this:
[
{
activity: 'stack overflow event',
description: 'It's all about SO',
intensity: 'Very chill',
hostId: ObjectId(5ea1e3c89dcab6c27d1eb891),
}
]
})
.catch(err=>console.log(err))
//When you use .populate()
db.activity.findOne({activity:'stack overflow event`})
.populate('user')
.then(activityData=>{
console.log(activityData);
//You will get something like this:
[
{
activity: 'stack overflow event',
description: 'It's all about SO',
intensity: 'Very chill',
//The hostId field will get populate with the user object
hostId: {
name: 'SO Test User',
nickName: 'soTest',
email: 'xxx@xxx.com',
....it continues
}
}
]
})
.catch(err=>console.log(err))