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

Mongodb、$lookupを使用した集計クエリ

    特定の人物のドキュメントについては、 populate()を使用できます

    のように機能します
    var query = mongoose.model("person").find({ "name": "foo" }).populate("projects.tags");
    

    また、たとえば「MongoDB」または「Node JS」のタグを持つ人を検索する場合は、populate()にクエリオプションを含めることができます。 関数のオーバーロード:

    var query = mongoose.model("person").find({ "name": "foo" }).populate({
        "path": "projects.tags",
        "match": { "en": { "$in": ["MongoDB", "Node JS"] } }
    });
    

    "project.tags"にすべてのタグを存在させたい場合 すべての人にとって、集約フレームワークが進むべき道です。人物コレクションでこのパイプラインを実行し、 $lookupを使用することを検討してください。 タグコレクションで左結合を行う演算子:

    mongoose.model('person').aggregate([
        { "$unwind": "$projects" },
        { "$unwind": "$projects.tags" },
        {
            "$lookup": {
                "from": "tags",
                "localField": "projects.tags",
                "foreignField": "_id",
                "as": "resultingTagsArray"
            }
        },
        { "$unwind": "$resultingTagsArray" },
        {
            "$group": {
                "_id": null,
                "allTags": { "$addToSet": "$resultingTagsArray" },
                "count": { "$sum": 1 }
            }
        }
     ]).exec(function(err, results){
        console.log(results);
     })
    

    特定の人には、 $matchを適用します ドキュメントをフィルタリングするための最初のステップとしてのパイプライン:

    mongoose.model('person').aggregate([
        { "$match": { "name": "foo" } },
        { "$unwind": "$projects" },
        { "$unwind": "$projects.tags" },
        {
            "$lookup": {
                "from": "tags",
                "localField": "projects.tags",
                "foreignField": "_id",
                "as": "resultingTagsArray"
            }
        },
        { "$unwind": "$resultingTagsArray" },
        {
            "$group": {
                "_id": null,
                "allTags": { "$addToSet": "$resultingTagsArray" },
                "count": { "$sum": 1 }
            }
        }
     ]).exec(function(err, results){
        console.log(results);
     })
    

    $lookupをサポートしていないMongoDBバージョン>=2.6または<=3.0を使用している場合の別の回避策 演算子は、集計の結果を次のように入力します。

    mongoose.model('person').aggregate([
        { "$unwind": "$projects" },
        { "$unwind": "$projects.tags" },    
        {
            "$group": {
                "_id": null,
                "allTags": { "$addToSet": "$projects.tags" }
            }
        }
     ], function(err, result) {
        mongoose.model('person')
        .populate(result, { "path": "allTags" }, function(err, results) {
            if (err) throw err;
            console.log(JSON.stringify(results, undefined, 4 ));
        });
    });
    


    1. Pymongo / MongoDB:インデックスを作成しますか、それともインデックスを確保しますか?

    2. アクションケーブル5にはRedisが必要ですか?

    3. Debian10にCouchDBをインストールする方法

    4. MongoDB-ファイルサイズは巨大で大きくなっています