Схема мангуста внутри схемы

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

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



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

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

Спасибо


person 0xSina    schedule 05.01.2012    source источник
comment
Вы выполняете соединение между двумя коллекциями или хотите хранить их поверх задачи?   -  person Jamund Ferguson    schedule 05.01.2012


Ответы (3)


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

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 заполнять, чтобы упростить ваши запросы. Чтобы получить это, вы можете сделать следующее:

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

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

person glortho    schedule 05.01.2012
comment
спасибо за подробный ответ. У меня есть еще один вопрос, но, возможно, мне следует создать новый вопрос. - person 0xSina; 05.01.2012
comment
.run() был заменен на .exec() как кажется - person Der Hochstapler; 04.02.2013
comment
другая [ссылка][1] с [наполнить][2] тоже может вам помочь. [1]: gistflow.com/posts/46-mongoose-populate [2] : mongoosejs.com/docs/populate.html - person AbdulMomen عبدالمؤمن; 30.04.2015

Начиная с версии 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
});
person Ben Henderson    schedule 17.07.2019

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

var TaskSchema = new Schema({
    name            : String,
    lastPerformed   : Date,
    folder          : String,
    user            : {
        name        : String,
        app_key     : String,
        app_secret  : String
    }
 })
person Jamund Ferguson    schedule 05.01.2012
comment
Не устранит ли это возможность напрямую запрашивать пользователей, а также потенциально приведет к дублированию пользовательских объектов во многих задачах? Если бы вы собирались свести модель данных только к одной структуре, я бы подумал, что вы бы хотели, чтобы UserSchema была родителем задач, а не наоборот. - person VictorB; 18.02.2015
comment
делает код беспорядочным. Следовательно, нужна схема внутри схемы - person Flyn Sequeira; 26.02.2018
comment
Это не масштабируемое решение для схем, которые используют несколько или большие схемы, встроенные в них. Я думаю, что OP (и я) хотим нетривиальных решений. - person Furkan Toprak; 31.07.2020