Трябва или да създадете НОВА схема за вашите вградени документи, или да оставите декларацията за типа като празен масив, така че mongoose
интерпретира като Mixed
тип.
var userSchema = new mongoose.Schema({
name: String,
photos: []
});
var User = mongoose.model('User', userSchema);
-- ИЛИ --
var userSchema = new mongoose.Schema({
name: String,
photos: [photoSchema]
});
var photoSchema = new mongoose.Schema({
src: String,
title: String
});
var User = mongoose.model('User', userSchema);
И тогава можете да запазите по следния начин:
var user = new User({
name: 'Bob',
photos: [ { src: '/path/to/photo.png' }, { src: '/path/to/other/photo.png' } ]
});
user.save();
От тук можете просто да използвате примитиви за масиви, за да намерите вградените си документи:
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' }
});
-- ИЛИ --
Можете да използвате специалния id()
метод във вградените документи за търсене по идентификатор:
User.findOne({name: 'Bob'}, function (err, user) {
user.photos.id(photo._id);
});
Можете да прочетете повече тук:http://mongoosejs.com/docs/subdocs.html
Уверете се, че НЕ регистрирайте схемата с mongoose, в противен случай тя ще създаде нова колекция. Също така имайте предвид, че ако дъщерните документи се търсят често, би било добра идея да използвате референции и популация като по-долу. Въпреки че удря DB два пъти, е много по-бързо поради индексирането. Също така, mongoose
ще се срине при двойни вложени документи (т.е. децата имат и детски документи)
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);
});
Съответните документи могат да бъдат намерени тук http://mongoosejs.com/docs/populate.html