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

MongoDB, Mongoose:Hvordan finder man underdokument i fundet dokument?

Du skal enten oprette et NYT skema til dine indlejrede dokumenter eller lade typedeklarationen være et tomt array, så mongoose tolker som en Mixed type.

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

-- ELLER --

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

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

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

Og så kan du spare således:

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

user.save();

Herfra kan du blot bruge array-primitiver til at finde dine indlejrede dokumenter:

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

-- ELLER --

Du kan bruge det specielle id() metode i indlejrede dokumenter til at slå op efter id:

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

Du kan læse mere her:http://mongoosejs.com/docs/subdocs.html

Sørg for, at du IKKE registrer skemaet med mongoose, ellers vil det oprette en ny samling. Husk også, at hvis der ofte søges efter børnedokumenterne, vil det være en god idé at bruge refs og population som nedenfor. Selvom det rammer DB to gange, er det meget hurtigere på grund af indeksering. Også mongoose vil bonke på dobbelte indlejrede dokumenter (dvs. børnene har også børnedokumenter)

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

Relevante dokumenter kan findes her http://mongoosejs.com/docs/populate.html



  1. MongoDB $sin

  2. Kan ikke autentificere på mongodb med PHP

  3. Oprettelse af nye Meteor-samlinger i farten

  4. Forstå MongoDB Client Timeout-indstillinger