Запрос Mongoose/mongoDB... но я пришел из sql-фона
Я прихожу из sql-фона, поэтому запись запросов в sql, где я соединяю таблицы, довольно проста, но я думаю, что мне не хватает этого в mongoose/mongodb
В основном я знаю Subscriber_ID (который сопоставляется с документом в пользовательской коллекции)
Я хочу вытащить группу проектов со всеми проектами, к которым принадлежит пользователь, поэтому, если бы я написал это в pseduo sql, это было бы как
Select
ProjectGroup.title,
Project.Title
FROM
ProjectGroup,
Project,
User
WHERE
User.id = req.body.subscriber_id
AND Project.subscriber_id = User.id
AND ProjectGroup.project_id = Project.id
Должен быть способ сделать похожие соединения в mongoose/mongodb, потому что тип является правильной привязкой к схеме?
Мои схемы.....
Схема проектной группы
var ProjectGroupSchema = new Schema({
title : String
, projects : [ { type: Schema.Types.ObjectId, ref: 'Project' } ]
});
Схема проекта
var ProjectSchema = new Schema({
title : {type : String, default : '', required : true}
, subscribers : [{ type: Schema.Types.ObjectId, ref: 'User' }]
});
Пользовательская схема
var UserSchema = new Schema({
first_name : {type: String, required: true}
, last_name : {type: String, required: true}
});
Спасибо!
Ответы
Ответ 1
Вы всего в одном шаге!
Схема проектной группы:
var ProjectGroupSchema = new Schema({
title : String
});
Схема проекта:
var ProjectSchema = new Schema({
title : {type : String, default : '', required : true},
group : {type: Schema.Types.ObjectId, ref: 'ProjectGroup' },
_users : [{type: Schema.Types.ObjectId, ref: 'User' }]
});
Пользовательская схема:
var UserSchema = new Schema({
first_name : {type: String, required: true},
last_name : {type: String, required: true},
subscribing : [{type: Schema.Types.ObjectId, ref: 'Project' }]
});
Затем вы можете сделать следующее:
user.findById(req.userId)
.populate('subscribing')
.exec(function(err, user){
console.log(user.subscribing);
})
Или:
project.find({
subscriber : req.userId
})
.populate('subscriber')
.populate('group')
.exec(function(err, projects){
console.log(projects);
})
Ответ 2
В Mongodb нет объединений. Этот вопрос, на мой взгляд, является хорошей ссылкой:
MongoDB и "присоединяется"
Подводя итог, должны быть приняты различные стратегии с mongodb для проблем, которые будут решаться с помощью объединений в реляционных БД. Я бы сказал, что в основном вы делаете одну из этих двух вещей:
- Встраивание: вы вставляете информацию в один документ, который в реляционной БД должен быть распределен между различными таблицами.
- Объединение информации на стороне клиента. Когда вам нужно использовать информацию из нескольких мест, вы запрашиваете много раз, а затем складываете фрагменты в своем клиенте.