MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB, Mongoose:Как да намеря поддокумент в намерен документ?

Трябва или да създадете НОВА схема за вашите вградени документи, или да оставите декларацията за типа като празен масив, така че mongoose интерпретира като Mixed тип.

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

-- ИЛИ --

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

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

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

И тогава можете да запазите по следния начин:

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

user.save();

От тук можете просто да използвате примитиви за масиви, за да намерите вградените си документи:

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

-- ИЛИ --

Можете да използвате специалния id() метод във вградените документи за търсене по идентификатор:

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

Можете да прочетете повече тук:http://mongoosejs.com/docs/subdocs.html

Уверете се, че НЕ регистрирайте схемата с mongoose, в противен случай тя ще създаде нова колекция. Също така имайте предвид, че ако дъщерните документи се търсят често, би било добра идея да използвате референции и популация като по-долу. Въпреки че удря DB два пъти, е много по-бързо поради индексирането. Също така, mongoose ще се срине при двойни вложени документи (т.е. децата имат и детски документи)

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

Съответните документи могат да бъдат намерени тук http://mongoosejs.com/docs/populate.html



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Десериализиране на идентификатора на обекта на Mongo DB с помощта на JSON сериализатор

  2. Каква е разликата между findAndModify и update в MongoDB?

  3. heroku mongohq и mongoid Mongo::ConnectionFailure

  4. Поддържане отворена връзка с база данни MongoDB

  5. NoSQL (MongoDB) срещу Lucene (или Solr) като ваша база данни