Du måste antingen skapa ett NYTT schema för dina inbäddade dokument eller lämna typdeklarationen som en tom array så att mongoose
tolkar som en Mixed
typ.
var userSchema = new mongoose.Schema({
name: String,
photos: []
});
var User = mongoose.model('User', userSchema);
-- ELLER --
var userSchema = new mongoose.Schema({
name: String,
photos: [photoSchema]
});
var photoSchema = new mongoose.Schema({
src: String,
title: String
});
var User = mongoose.model('User', userSchema);
Och då kan du spara så här:
var user = new User({
name: 'Bob',
photos: [ { src: '/path/to/photo.png' }, { src: '/path/to/other/photo.png' } ]
});
user.save();
Härifrån kan du helt enkelt använda arrayprimitiver för att hitta dina inbäddade dokument:
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' }
});
-- ELLER --
Du kan använda den speciella id()
metod i inbäddade dokument för att söka efter id:
User.findOne({name: 'Bob'}, function (err, user) {
user.photos.id(photo._id);
});
Du kan läsa mer här:http://mongoosejs.com/docs/subdocs.html
Se till att du INTE registrera schemat med mongoose, annars skapas en ny samling. Tänk också på att om barndokumenten söks ofta, skulle det vara en bra idé att använda refs och population som nedan. Även om det träffar DB två gånger, är det mycket snabbare på grund av indexering. Även mongoose
kommer att bocka på dubbla kapslingsdokument (dvs. barnen har också barndokument)
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);
});
Relevanta dokument finns här http://mongoosejs.com/docs/populate.html