MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB, Mongoose:come trovare il documento secondario nel documento trovato?

Devi creare un NUOVO schema per i tuoi documenti incorporati o lasciare la dichiarazione del tipo come un array vuoto in modo da mongoose interpreta come un Mixed digitare.

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

-- OPPURE --

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 poi puoi risparmiare così:

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

user.save();

Da qui, puoi semplicemente utilizzare le primitive di array per trovare i tuoi documenti incorporati:

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

-- OPPURE --

Puoi usare lo speciale id() metodo nei documenti incorporati per cercare per ID:

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

Puoi leggere di più qui:http://mongoosejs.com/docs/subdocs.html

Assicurati di NON registra lo schema con mongoose, altrimenti creerà una nuova raccolta. Tieni inoltre presente che se i documenti figlio vengono cercati spesso, sarebbe una buona idea utilizzare riferimenti e popolazione come di seguito. Anche se colpisce due volte il DB, è molto più veloce a causa dell'indicizzazione. Inoltre, mongoose funzionerà su documenti con doppia nidificazione (ad es. I bambini hanno anche documenti per bambini)

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

I documenti pertinenti possono essere trovati qui http://mongoosejs.com/docs/populate.html