MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB, Mongoose:Wie finde ich ein Filialdokument in einem gefundenen Dokument?

Sie müssen entweder ein NEUES Schema für Ihre eingebetteten Dokumente erstellen oder die Typdeklaration als leeres Array belassen, also mongoose interpretiert als Mixed Typ.

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

-- ODER --

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

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

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

Und dann kannst du so speichern:

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

user.save();

Von hier aus können Sie einfach Array-Primitive verwenden, um Ihre eingebetteten Dokumente zu finden:

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

-- ODER --

Sie können die spezielle id() verwenden Methode in eingebetteten Dokumenten, um anhand der ID nachzuschlagen:

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

Hier können Sie mehr lesen:http://mongoosejs.com/docs/subdocs.html

Stellen Sie sicher, dass Sie es nicht tun Registrieren Sie das Schema bei Mungo, sonst wird eine neue Sammlung erstellt. Denken Sie auch daran, dass es eine gute Idee wäre, Refs und Population wie unten zu verwenden, wenn häufig nach untergeordneten Dokumenten gesucht wird. Obwohl es die DB zweimal trifft, ist es wegen der Indizierung viel schneller. Auch mongoose wird sich an doppelt verschachtelten Dokumenten vergnügen (d. h. die Kinder haben auch Kinderdokumente)

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 Dokumente finden Sie hier http://mongoosejs.com/docs/populate.html