sql >> データベース >  >> NoSQL >> MongoDB

マングース-.populateを使用してネストされたオブジェクトにアクセスする

    これがあなたが望むものの簡略版です。

    設定する基本データ、最初に「学生」:

    { 
       "_id" : ObjectId("53aa90c83ad07196636e175f"), 
       "name" : "Bill",
       "rollNo" : 1,
       "class" : 12 
    },
    { 
        "_id" : ObjectId("53aa90e93ad07196636e1761"),
        "name" : "Ted",
        "rollNo" : 2,
        "class" : 12
    }
    

    そして、「チーム」コレクション:

    { 
        "_id" : ObjectId("53aa91b63ad07196636e1762"),
        "name" : "team1",
        "lead" : "me",
        "students" : [ 
            { 
                "block" : 1,
                "status" : "Y",
                "student" : ObjectId("53aa90c83ad07196636e175f")
            },
            { 
                "block" : 2,
                "status" : "N",
                "student" : ObjectId("53aa90e93ad07196636e1761")
            }
        ]
    }
    

    これがあなたのやり方です:

    var async = require('async'),
        mongoose = require('mongoose');
        Schema = mongoose.Schema;
    
    mongoose.connect('mongodb://localhost/team');
    
    var teamSchema = new Schema({
      name: String,
      lead: String,
      students: [{
        block: Number,
        status: String,
        student: {
          type: Schema.ObjectId, ref: 'Student'
        }
      }]
    });
    
    var studentSchema = new Schema({
      name: String,
      rollNo: Number,
      class: Number
    });
    
    var Team = mongoose.model( "Team", teamSchema );
    var Student = mongoose.model( "Student", studentSchema );
    
    Team.findById("53aa91b63ad07196636e1762")
      .select('students')
      .exec(function(err, team) {
        console.log( team );
    
        async.forEach(team.students, function(student,callback) {
          Student.populate(
            student,
            { "path": "student" },
            function(err,output) {
              if (err) throw err;
              callback();
            }
          );
        },function(err) {
          console.log( JSON.stringify( team, undefined, 4 ) );
        });
    
      });
    

    そしてそれはあなたに結果を与えます:

    {
        "_id": "53aa91b63ad07196636e1762",
        "students": [
            {
                "block": 1,
                "status": "Y",
                "student": {
                    "_id": "53aa90c83ad07196636e175f",
                    "name": "Bill",
                    "rollNo": 1,
                    "class": 12
                }
            },
            {
                "block": 2,
                "status": "N",
                "student": {
                    "_id": "53aa90e93ad07196636e1761",
                    "name": "Ted",
                    "rollNo": 2,
                    "class": 12
                }
            }
        ]
    }
    

    あなたは本当に「非同期」モジュールを必要としません、しかし私はそれがそうであったようにただ「習慣」にあります。 「ブロック」しないので、もっと良いと思います。

    ご覧のとおり、最初に.populate() _idから「キー」を押すことを期待しているため、呼び出しは何もしません。 この「厳密に言えば」ではない配列入力からの外部コレクションの値。「キー」は「外部キー」を含む「学生」にあります。

    私は本当にこれをここでの最近の回答 でカバーしました 、おそらくあなたの状況に正確に固有ではありません。あなたの検索は、あなたが参照を引き出すための正しい「同じ答え」(正確ではありませんが)を見つけられなかったようです。



    1. マングース|ミドルウェア|エラーがスローされたときにpre/postフックによって実行されるロールバック操作

    2. スモールファイルの問題

    3. MacOSターミナルからリモートmongoサーバーに接続するにはどうすればよいですか?

    4. 50.000.000ドキュメントに加えて大規模なコレクションでのMongoDBの書き込みパフォーマンスの低下