U moet ofwel een NIEUW Schema maken voor uw ingesloten documenten, of de typedeclaratie als een lege array laten zodat mongoose
interpreteert als een Mixed
typ.
var userSchema = new mongoose.Schema({
name: String,
photos: []
});
var User = mongoose.model('User', userSchema);
-- OF --
var userSchema = new mongoose.Schema({
name: String,
photos: [photoSchema]
});
var photoSchema = new mongoose.Schema({
src: String,
title: String
});
var User = mongoose.model('User', userSchema);
En dan kun je zo opslaan:
var user = new User({
name: 'Bob',
photos: [ { src: '/path/to/photo.png' }, { src: '/path/to/other/photo.png' } ]
});
user.save();
Vanaf hier kunt u eenvoudig array-primitieven gebruiken om uw ingesloten documenten te vinden:
User.findOne({name: 'Bob'}, function (err, user) {
var photo = user.photos.filter(function (photo) {
return photo.title === 'My awesome photo';
}).pop();
console.log(photo); //logs { src: '/path/to/photo.png', title: 'My awesome photo' }
});
-- OF --
U kunt de speciale id()
. gebruiken methode in ingesloten documenten om op te zoeken op id:
User.findOne({name: 'Bob'}, function (err, user) {
user.photos.id(photo._id);
});
U kunt hier meer lezen:http://mongoosejs.com/docs/subdocs.html
Zorg ervoor dat u NIET registreer het schema met mangoest, anders wordt er een nieuwe verzameling gemaakt. Houd er ook rekening mee dat als er vaak naar de onderliggende documenten wordt gezocht, het een goed idee zou zijn om refs en populatie te gebruiken zoals hieronder. Hoewel het de DB twee keer bereikt, is het veel sneller vanwege indexering. Ook mongoose
zal bonken op dubbel nestende documenten (d.w.z. de kinderen hebben ook kinderdocumenten)
var user = mongoose.Schema({
name: String,
photos: [{ type: Schema.Types.ObjectId, ref: 'Photo' }]
});
var photo = mongoose.Schema({
src: String,
title: String
});
User
.findOne({ name: 'foo' })
.populate('photos')
.exec(function (err, user) {
console.log(user.photos[0].src);
});
Relevante documenten zijn hier te vinden http://mongoosejs.com/docs/populate.html