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

配列内の外部_idを使用したMongoDb集約$lookup

    $unwindする必要があります スカラーとサブドキュメントの両方の外部_idをフラット化し、$groupを追加します パイプラインの最後でステージングして、元の構造に戻します。

    $first フィールドと$pushを保持するアキュムレータ $arrayElemAtを使用 $unwindを調整するために配列値を累積します

    var linkedModels = [
        {
            "$match": { "del": false }
        }, 
        {
            "$lookup": {
                from: "charnpcalign",
                localField: "align",
                foreignField: "_id",
                as: "linked_align"
            }
        }, 
        {
            "$unwind":"$classes"
        },
        {
            "$lookup": {
                from: "charnpcclass",
                localField: "classes",
                foreignField: "_id",
                as: "linked_classes"
            }
        },
        {
            "$group": {
               "_id": "$_id",
               "name": {"$first":"$name"},
               "align": {"$first":"$align"},
               "classes":{"$push":"$classes"},
               "carrying":{"$first":"$carrying"},
               "linked_align":{"$first":"$linked_align"},
               "linked_classes":{"$push":{"$arrayElemAt":["$linked_classes",0]}}
            }
        },
        {
            "$unwind":"$carrying"
        },
        {
            "$lookup": {
                from: "item",
                localField: "carrying.itemId",
                foreignField: "_id",
                as: "linked_carrying"
            }
        },
        {
            "$group": {
               "_id": "$_id",
               "name": {"$first":"$name"},
               "align": {"$first":"$align"},
               "classes":{"$first":"$classes"},
               "linked_align":{"$first":"$linked_align"},
               "carrying":{"$push":"$carrying"},
               "linked_carrying":{"$push":{"$arrayElemAt":["$linked_carrying",0]}}
            }
        }
    ]
    

    $unwindは必要ありません スカラー配列(classes )3.4バージョンでは、{"classes":{"$push":"$classes"}}を置き換えることができます &{"linked_classes":{"$push":{$arrayElemAt:["$linked_classes",0]}}} with {"classes":{"$first":"$classes"}}{"linked_classes":{"$first":"$linked_classes"}} それぞれ。




    1. mongodb:オブジェクトIDをBSON::ObjectIdに変換します

    2. マングースモデル、文字列の配列、オブジェクトの配列構造

    3. MongoRepositoryの実装/オーバーライドはHATEOASフォーマットを維持します

    4. MongoDBの日付演算子、メソッド、変数のリスト