MongoDB,Mongoose:如何在找到的文件中找到子文档?

gia*_*ial 19 mongoose mongodb

我坚持尝试_id在找到的文档中获取子文档.

示例模式

var User = mongoose.Schema({
        name:       String,
        photos:    [{src: String, title: String}]
    });
var Team = db.model('Team', Team);
Run Code Online (Sandbox Code Playgroud)

现在我得到一个用户:

myUser = User.findOne(...)...
Run Code Online (Sandbox Code Playgroud)

我怎么能通过src_id(或title)得到他的照片呢?

就像是:

myUser.photos.findOne({'_id': myId})
Run Code Online (Sandbox Code Playgroud)

srq*_*inn 45

您需要为嵌入文档创建一个新模式,或者将类型声明保留为空数组,以便mongoose将其解释为Mixed类型.

var userSchema = new mongoose.Schema({
  name: String,
  photos: []
});
var User = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

- 要么 -

var userSchema = new mongoose.Schema({
  name: String,
  photos: [photoSchema]
});

var photoSchema = new mongoose.Schema({
  src: String,
  title: String
});

var User = mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

然后你可以这样保存:

var user = new User({
  name: 'Bob',
  photos: [ { src: '/path/to/photo.png' }, { src: '/path/to/other/photo.png' } ]
});

user.save();
Run Code Online (Sandbox Code Playgroud)

从这里,您可以简单地使用数组原语来查找嵌入的文档:

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' }
});
Run Code Online (Sandbox Code Playgroud)

- 要么 -

您可以使用id()嵌入式文档中的特殊方法按ID查找:

User.findOne({name: 'Bob'}, function (err, user) {
    user.photos.id(photo._id);
});
Run Code Online (Sandbox Code Playgroud)

您可以在这里阅读更多内容: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);
  });
Run Code Online (Sandbox Code Playgroud)

相关文档可以在http://mongoosejs.com/docs/populate.html找到