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

マングースでmysqlの左結合のような関数を実装する方法

    mongodbにjoinステートメントがないため、実行しようとしていることは不可能です。

    これは2つの方法で実現できます。

    1- DBRefによる: スキーマをすべてのユーザー情報を含むスキーマに変更し、現在のように2つの異なるスキーマに分割しないでください。非正規化 。次に、人口 を使用できます。 すべての人のデータを取得する機能。

    2-手動参照による: 2番目の解決策は、データベースを2回呼び出して、ユーザーIDをフィルターとして使用してpersonProfileデータを取得することです。

    例1:

    このようにして、データベースを2回呼び出すことなく、すべての人のデータを取得できます。

    var personSchema = Schema({
      _id     : Number,
      name    : String,
      birthday: Date,
      profilelink: String,
      email: String
    });
    
    var storySchema = Schema({
      _creator : { type : Schema.Types.ObjectId, ref: 'Person' },
      title    : String
    });
    
    Story
    .find()
    .populate(['_creator'])
    .exec(function(err, stories) {
        //do your stuff here
    }
    

    タイプSchema.Types.ObjectIdを使用していることに注意してください 番号ではありません 。このようにして、 _creatorに新しい値を割り当てることができます _idのいずれかを渡す または人物オブジェクト マングースはオブジェクトをその_idに変換します。たとえば、次のように投稿できます

    {
        _creator : {
            _id     : 123123123123,
            name    : 'Foo',
            birthday: '0000-00-00',
            profilelink: 'http://foo.bar',
            email: '[email protected]'
        },
        title    : 'Mr'
    }
    

    ...そしてマングースはに変換されます

    {
        _creator : 123123123123,
        title    : 'Mr'
    }
    

    例2:

    このようにして、データは引き続き正規化され、2回目の呼び出しですべての人のデータを取得できます。

    Story
    .find()
    .exec(function(err, stories) {
        var arrayLength = stories.length;
    
        for (var i = 0; i < arrayLength; i++) {
            var story = stories[i];
            personProfile.findById(story._creator, function (err, person) {
                story._creator = person;
            }
        };
        // do your stuff here
    }
    



    1. Mongoプロジェクションクエリの結果は、シェルとnodejsアプリケーションでのテストとは異なります

    2. IDに基づいて2層のネストされたオブジェクトを更新します

    3. DBRefs(Mongoドキュメント参照)が熱心にフェッチされていない

    4. Dockerを使用したMongoDBのデプロイ