Подтвердить что ты не робот

Схема 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
})

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

Спасибо

4b9b3361

Ответ 1

Есть несколько способов сделать это. Самое простое:

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
  }
}

Другой способ - воспользоваться функцией Mongoose 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
});

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

Ответ 2

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

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

Ответ 3

Начиная с версии 4.2.0, mongoose поддерживает отдельные поддокументы.

Из документов:

var childSchema = new Schema({ name: 'string' });

var parentSchema = new Schema({
  // Array of subdocuments
  children: [childSchema],
  // Single nested subdocuments. Caveat: single nested subdocs only work
  // in mongoose >= 4.2.0
  child: childSchema
});