sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB, Mongoose:¿Cómo encontrar un subdocumento en un documento encontrado?

Debe crear un NUEVO esquema para sus documentos incrustados o dejar la declaración de tipo como una matriz en blanco para que mongoose se interpreta como Mixed tipo.

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

-- O --

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

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

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

Y luego puedes guardar así:

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

user.save();

Desde aquí, simplemente puede usar primitivas de matriz para encontrar sus documentos incrustados:

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

-- O --

Puedes usar el id() especial método en documentos incrustados para buscar por id:

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

Puede leer más aquí:http://mongoosejs.com/docs/subdocs.html

Asegúrate de NO registre el esquema con mongoose, de lo contrario, creará una nueva colección. También tenga en cuenta que si los documentos secundarios se buscan con frecuencia, sería una buena idea usar referencias y población como se muestra a continuación. Aunque llega a la base de datos dos veces, es mucho más rápido debido a la indexación. Además, mongoose se beneficiará de documentos de doble anidamiento (es decir, los niños también tienen documentos de niños)

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);
  });

Los documentos relevantes se pueden encontrar aquí http://mongoosejs.com/docs/populate.html