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

时间:2014-01-15 16:14:30

标签: mongodb mongoose

我一直试图通过_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})

2 个答案:

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