2012-01-05 5 views
19

Как добавить схему в другую схему? Это не кажется, действительно:Схема Mongoose в схеме

var UserSchema = new Schema({ 
    name  : String, 
    app_key  : String, 
    app_secret : String 
}) 



var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : UserSchema 
}) 

Я проверил сайт и он показывает, как объявить его в массив, но не для одного.

Thanks

+0

Вы делаете соединение между двумя коллекциями или хотите сохранить их поверх задачи? –

ответ

26

Есть несколько способов сделать это. Проще всего это просто:

var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : Schema.ObjectId 
}); 

Тогда вы просто должны убедиться, что ваше приложение пишет, что идентификатор и использовать его в запросах для извлечения «связанные» данные по мере необходимости.

Это нормально при поиске заданий по идентификатору пользователя, но более громоздкого при запросе пользователя с идентификатором задачи:

// Get tasks with user id 
Task.find({user: user_id}, function(err, tasks) {...}); 

// Get user from task id 
Task.findById(id, function(err, task) { 
    User.findById(task.user, function(err, user) { 
    // do stuff with user 
    } 
} 

Другим способом, чтобы воспользоваться функцией populate мангуста, чтобы упростить свои запросы. Для того, чтобы получить это, вы можете сделать следующее:

var UserSchema = new Schema({ 
    name  : String, 
    app_key  : String, 
    app_secret : String, 
    tasks  : [{type: Schema.ObjectId, ref: 'Task'}] // assuming you name your model Task 
}); 

var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : {type: Schema.ObjectId, ref: 'User'} // assuming you name your model User 
}); 

С этим, ваш запрос для всех пользователей, включая массивы своих задач могут быть:

User.find({}).populate('tasks').run(function(err, users) { 
    // do something 
}); 

Конечно, это означает сохранение идентификаторов в оба места. Если это вас беспокоит, лучше всего придерживаться первого метода и просто привыкнуть к написанию более сложных (но все же достаточно простых) запросов.

+0

спасибо за подробный ответ. У меня есть другой вопрос, но, возможно, я должен создать новый вопрос. – 0xSina

+2

'.run()' был заменен на '.exec()', как кажется –

+0

другой [link] [1], с [populate] [2] может помочь вам. [1]: http://gistflow.com/posts/46-mongoose-populate [2]: http://mongoosejs.com/docs/populate.html –

8

Как насчет этого простого решения?

var TaskSchema = new Schema({ 
    name   : String, 
    lastPerformed : Date, 
    folder   : String, 
    user   : { 
     name  : String, 
     app_key  : String, 
     app_secret : String 
    } 
}) 
+6

Не исключено ли это из-за возможности запроса пользователей, а также потенциально привести к дублированию объектов пользователей во многих задачах? Если вы собираетесь сгладить модель данных только одной структурой, я бы подумал, что вы бы хотели, чтобы UserSchema был родителем задач, а не наоборот. – VictorB

+0

делает код грязным. Следовательно, требуется схема в схеме –

Смежные вопросы