sql >> Database >  >> NoSQL >> MongoDB

MongoDB, Mongoose:hoe vind ik een subdocument in een gevonden document?

U moet ofwel een NIEUW Schema maken voor uw ingesloten documenten, of de typedeclaratie als een lege array laten zodat mongoose interpreteert als een Mixed typ.

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

-- OF --

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

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

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

En dan kun je zo opslaan:

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

user.save();

Vanaf hier kunt u eenvoudig array-primitieven gebruiken om uw ingesloten documenten te vinden:

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

-- OF --

U kunt de speciale id() . gebruiken methode in ingesloten documenten om op te zoeken op id:

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

U kunt hier meer lezen:http://mongoosejs.com/docs/subdocs.html

Zorg ervoor dat u NIET registreer het schema met mangoest, anders wordt er een nieuwe verzameling gemaakt. Houd er ook rekening mee dat als er vaak naar de onderliggende documenten wordt gezocht, het een goed idee zou zijn om refs en populatie te gebruiken zoals hieronder. Hoewel het de DB twee keer bereikt, is het veel sneller vanwege indexering. Ook mongoose zal bonken op dubbel nestende documenten (d.w.z. de kinderen hebben ook kinderdocumenten)

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 documenten zijn hier te vinden http://mongoosejs.com/docs/populate.html



  1. Ondersteunt Spring Data Redis (1.3.2.RELEASE) JedisSentinelPool van jedis?

  2. Gelijktijdige ImageMagick-verzoeken optimaliseren met redis/php-resque

  3. Implementeer ScaleGrid DBaaS voor Redis™ in AWS Virtual Private Cloud (VPC)

  4. MongoDB® met Hadoop en gerelateerde Big Data-technologieën