MongoDB,Mongoose:如何在找到的文档中找到子文档?
我一直在试图通过找到的文档中的MongoDB,Mongoose:如何在找到的文档中找到子文档?,mongodb,mongoose,Mongodb,Mongoose,我一直在试图通过找到的文档中的\u id获取子文档 示例模式 var User = mongoose.Schema({ name: String, photos: [{src: String, title: String}] }); var Team = db.model('Team', Team); 现在我得到一个用户: myUser = User.findOne(...)... 我现在怎样才能通过\u id(或title)获得他的
\u id
获取子文档
示例模式
var User = mongoose.Schema({
name: String,
photos: [{src: String, title: String}]
});
var Team = db.model('Team', Team);
现在我得到一个用户:
myUser = User.findOne(...)...
我现在怎样才能通过\u id
(或title
)获得他的照片的src
比如:
myUser.photos.findOne({'_id': myId})
您需要为嵌入的文档创建一个新的模式,或者将类型声明保留为空白数组,以便
mongoose
解释为Mixed
类型
var userSchema = new mongoose.Schema({
name: String,
photos: []
});
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);
});
您可以在此处阅读更多内容:
确保您不向mongoose注册架构,否则它将创建一个新集合。还请记住,如果经常搜索子文档,最好使用以下引用和填充。尽管它两次命中数据库,但由于索引,速度要快得多。另外,mongoose
将在双重嵌套文档上发出砰砰声(即,孩子们也有孩子文档)
相关文档可以在这里找到补充斯奎因的答案,根据我有限的经验,我认为
填充
是为了将不同集合的文档连接在一起
我想在这里你可以做User.findOne({name:'foo'},'photos')
,这是以下的缩写:
const query = User.findOne({ name: 'foo' })
query.select('photos')
这是一个好的正确的解决方案,但是。。。假设我已经找到了用户。不想再查询数据库了,就这样!过滤液对我来说是最好的。以前从未用过。谢谢如果您的嵌入式文档没有架构,或者它们的类型是
混合的
,我不相信您可以使用上述内置的.id()
函数,因为Mongoose不知道数据是否实际具有\u id
。在这种情况下,您应该使用.filter()
技术。我知道这很旧,但我想指出的是,这个答案中关于使用填充的最后一点并不是真正的最佳实践(当然取决于您的用例)。jibsales表示,应该经常引用“搜索过的”文档,但为了清晰起见,应该经常引用“编辑过”的文档。很小但很重要的区别。如果不注册模式,mongoose将如何将Photo的模式与user.Photos连接?
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);
});
const query = User.findOne({ name: 'foo' })
query.select('photos')