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()を使用できます IDで検索する埋め込みドキュメントのメソッド:

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

    詳細については、http://mongoosejs.com/docs/subdocs.html

    をご覧ください。

    必ずしないでください スキーマをmongooseに登録します。登録しないと、新しいコレクションが作成されます。また、子ドキュメントが頻繁に検索される場合は、以下のような参照と母集団を使用することをお勧めします。 DBに2回ヒットしますが、インデックス作成によりはるかに高速です。また、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. アレイ上のmongoDBアップサート

    2. MongoDB countDocuments()

    3. Sentinelおよびredis-pyでRedisを使用するときに新しいマスターノードにフェイルオーバーするにはどうすればよいですか?

    4. MongoDBの単一のコレクション内のドキュメント間のセットのセット交差を見つける方法は?