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')