你需要为嵌套文档创建一个新的模式,或者将类型声明留空数组,这样 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);
});
-- 或者 --
您可以在嵌入式文档中使用特殊的id()
方法按照ID进行查找:
User.findOne({name: 'Bob'}, function (err, user) {
user.photos.id(photo._id);
});
您可以在这里阅读更多:http://mongoosejs.com/docs/subdocs.html
请确保不要在Mongoose中注册模式,否则它将创建一个新的集合。同时请记住,如果经常搜索子文档,最好使用refs和population,如下所示。即使因为索引需要访问数据库两次,但速度仍然更快。另外,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
Mixed
类型,我认为您不能像上面描述的那样使用内置的.id()
函数,因为 Mongoose 不知道数据是否实际具有_id
。在这种情况下,您应该使用.filter()
技术。 - Tom Spencer