我一直试图通过_id
在找到的文档中获取子文档。
示例架构
var User = mongoose.Schema({
name: String,
photos: [{src: String, title: String}]
});
var Team = db.model('Team', Team);
现在我找到了一位用户:
myUser = User.findOne(...)...
如何通过它src
(或_id
)获取他的照片title
?
类似的东西:
myUser.photos.findOne({'_id': myId})
答案 0 :(得分:42)
您需要为嵌入文档创建一个新架构,或者将类型声明保留为空白数组,以便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()
方法按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
答案 1 :(得分:1)
根据我有限的经验,我认为BaseClass
加入srquinn的答案是为了加入来自不同馆藏的文件吗?
我想在这里你可以做populate
这是简写:
User.findOne({ name: 'foo' }, 'photos')