web-dev-qa-db-fra.com

Schéma mangouste dans le schéma

Comment puis-je ajouter un schéma à un autre schéma? Cela ne semble pas être valable:

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



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

J'ai vérifié le site Web et il montre comment le déclarer pour un tableau mais pas pour un seul.

Merci

28
0xSina

Il y a quelques façons de le faire. Le plus simple est juste ceci:

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

Il vous suffit ensuite de vous assurer que votre application écrit cet identifiant et l'utilise dans les requêtes pour extraire les données "associées" si nécessaire.

C'est très bien lors de la recherche de tâches par ID utilisateur, mais plus lourd lors de l'interrogation de l'utilisateur par ID de tâche:

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

Une autre façon est de profiter de la fonction populate de Mongoose pour simplifier vos requêtes. Pour l'obtenir, vous pouvez procéder comme suit:

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

Avec cela, votre requête pour tous les utilisateurs, y compris les tableaux de leurs tâches, pourrait être:

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

Bien sûr, cela signifie maintenir les identifiants aux deux endroits. Si cela vous dérange, il est préférable de s'en tenir à la première méthode et de vous habituer à écrire des requêtes plus complexes (mais toujours assez simples).

36
glortho

Et cette solution simple?

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

Depuis la version 4.2.0, mangouste prend en charge les sous-documents uniques.

De la les docs :

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
});
1
Ben Henderson