2012-01-05 15 views
19

Jak dodać schemat do innego schematu? To nie wydaje się być poprawne:Schemat mongozy w schemacie

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



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

Sprawdziłem stronę internetową i pokazuje, jak zadeklarować ją dla tablicy, ale nie dla singla.

Dzięki

+0

Czy łączysz dwie kolekcje lub chcesz je przechowywać na górze zadania? –

Odpowiedz

26

Istnieje kilka sposobów, aby to zrobić. Najprostszym jest właśnie to:

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

Wtedy po prostu trzeba upewnić się, że aplikacja jest piśmie, że identyfikator i używając go w zapytaniach do pobrania „związane” danych w razie potrzeby.

Jest to dobre rozwiązanie, gdy szukają zadań przez ID użytkownika, ale bardziej uciążliwe podczas odpytywania użytkownikowi przez id zadanie:

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

Innym sposobem jest skorzystanie z funkcji populate Mongoose, aby uprościć zapytania. Aby to uzyskać, można wykonać następujące czynności:

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

z tym, zapytanie dla wszystkich użytkowników, w tym tablice ich zadań może być:

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

Oczywiście, oznacza to utrzymywanie identyfikatory w obydwa miejsca. Jeśli ci to przeszkadza, najlepiej będzie trzymać się pierwszej metody i po prostu przywyknąć do pisania bardziej złożonych (ale wciąż wystarczająco prostych) zapytań.

+0

dzięki za szczegółową odpowiedź. Mam inne pytanie, ale może powinienem stworzyć nowe pytanie. – 0xSina

+2

'.run()' zostało zastąpione przez '.exec()' jak się wydaje –

+0

inny [link] [1], z [wypełnić] [2], może ci pomóc. [1]: http://gistflow.com/posts/46-mongoose-populate [2]: http://mongoosejs.com/docs/populate.html –

8

Co z tym prostym rozwiązaniem?

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

Czy to nie eliminuje możliwości wyszukiwania użytkownicy bezpośrednio, a także potencjalnie mogą prowadzić do powielania obiektów użytkowników w wielu zadaniach. Jeśli chcesz spłaszczyć model danych do jednej struktury, myślę, że chcesz, aby UserSchema był rodzicem zadań, a nie odwrotnie. – VictorB

+0

powoduje, że kod wygląda niechlujnie. Dlatego chciał schematu w schemacie –