MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB, Mongoose:Como encontrar subdocumento no documento encontrado?


Você precisa criar um NOVO esquema para seus documentos incorporados ou deixar a declaração de tipo como uma matriz em branco para que mongoose interpreta como um Mixed tipo.
var userSchema = new mongoose.Schema({
  name: String,
  photos: []
});
var User = mongoose.model('User', userSchema);

-- OU --

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

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

var User = mongoose.model('User', userSchema);

E então você pode salvar assim:
var user = new User({
  name: 'Bob',
  photos: [ { src: '/path/to/photo.png' }, { src: '/path/to/other/photo.png' } ]
});

user.save();

A partir daqui, você pode simplesmente usar primitivos de matriz para encontrar seus documentos incorporados:
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' }
});

-- OU --


Você pode usar o id() especial método em documentos incorporados para procurar por id:
User.findOne({name: 'Bob'}, function (err, user) {
    user.photos.id(photo._id);
});

Você pode ler mais aqui:http://mongoosejs.com/docs/subdocs.html

Certifique-se de NÃO registre o esquema com o mangusto, caso contrário ele criará uma nova coleção. Lembre-se também de que, se os documentos filhos forem pesquisados ​​com frequência, seria uma boa ideia usar refs e população como abaixo. Mesmo que atinja o banco de dados duas vezes, é muito mais rápido devido à indexação. Além disso, mongoose vai bater em documentos de aninhamento duplo (ou seja, as crianças também têm documentos filhos)
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);
  });

Documentos relevantes podem ser encontrados aqui http://mongoosejs.com/docs/populate.html