MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB, Mongoose :Comment trouver un sous-document dans un document trouvé ?

Vous devez soit créer un NOUVEAU schéma pour vos documents intégrés, soit laisser la déclaration de type sous forme de tableau vide afin que mongoose interprète comme un Mixed saisir.

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

Et puis vous pouvez économiser ainsi :

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

user.save();

À partir de là, vous pouvez simplement utiliser des primitives de tableau pour trouver vos documents intégrés :

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

Vous pouvez utiliser le spécial id() méthode dans les documents intégrés pour rechercher par identifiant :

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

Vous pouvez en savoir plus ici :http://mongoosejs.com/docs/subdocs.html

Assurez-vous de NE PAS enregistrez le schéma avec mongoose, sinon il créera une nouvelle collection. Gardez également à l'esprit que si les documents enfants sont souvent recherchés, il serait judicieux d'utiliser les références et la population comme ci-dessous. Même s'il atteint la base de données deux fois, c'est beaucoup plus rapide en raison de l'indexation. Aussi, mongoose sera bonk sur les documents à double imbrication (c'est-à-dire que les enfants ont également des documents pour enfants)

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

Les documents pertinents peuvent être trouvés ici http://mongoosejs.com/docs/populate.html