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

Mongoの1つのパイプラインでいくつかのコレクションを結合して並べ替える方法

    最新のMongo3.4バージョンでは、 $ファセット 複数の集計パイプラインで同じデータを処理し、すべての集計の結果を単一の出力に結合します。

    db.users.aggregate([
        { "$match": { "_id":1} },
        {
            "$facet": {
                "Received": [
                     {$lookup: {from: 'requests', localField: "_id", foreignField: "userId", as: "receivedRequest"}},
                     {$unwind: '$receivedRequest'},
                     {$lookup: {from: 'users', localField: "receivedRequest.requesterId", foreignField: "_id", as: "receivedUser"}},
                     {$project: {_id: '$receivedRequest.requesterId', profile: '$receivedUser.profile', weight: {$add: [4]}}}
                ],
                "Sent": [
                     {$lookup: {from: 'requests', localField: "_id", foreignField: "requesterId", as: "sentRequest"}},
                     {$unwind: '$sentRequest'},
                     {$lookup: {from: 'users', localField: "sentRequest.userId", foreignField: "_id", as: "sendUser"}},
                     {$project: {_id: '$sentRequest.userId', profile: '$sendUser.profile', weight: {$add: [3]}}}
                ],
                "Friends": [
                     {$lookup: {from: 'friends', localField: "_id", foreignField: "userId", as: "friends"}},
                     {$unwind: '$friends'},
                     {$lookup: {from: 'users', localField: "friends.friendId", foreignField: "_id", as: "friendUser"}},
                     {$project: {_id: '$friends.friendId', profile: '$friendUser.profile', weight: {$add: [2]}}}
                ],
                "Others": [
                    {$lookup: {from: 'friends', localField: "_id", foreignField: "friendId", as: "others"}},
                     {$unwind: '$others'},
                     {$lookup: {from: 'users', localField: "others.userId", foreignField: "_id", as: "other"}},
                     {$project: {_id: '$others.userId', profile: '$other.profile', weight: {$add: [1]}}}
                ]
            }
        }
    ]).pretty()
    

    サンプル出力:

    {
            "Received" : [
                    {
                            "_id" : 3,
                            "profile" : [
                                    {
                                            "name" : "John"
                                    }
                            ],
                            "weight" : 4
                    }
            ],
            "Sent" : [
                    {
                            "_id" : 4,
                            "profile" : [
                                    {
                                            "name" : "Jessica"
                                    }
                            ],
                            "weight" : 3
                    }
            ],
            "Friends" : [
                    {
                            "_id" : 2,
                            "profile" : [
                                    {
                                            "name" : "Ana"
                                    }
                            ],
                            "weight" : 2
                    }
            ],
            "Others" : [
                    {
                            "_id" : 5,
                            "profile" : [
                                    {
                                            "name" : "Sheldon"
                                    }
                            ],
                            "weight" : 1
                    }
            ]
    }
    



    1. キーの存在に応じてredisでハッシュキーの有効期限を設定する方法

    2. MongoDBでカスタムオブジェクトIDを作成する

    3. 複数のスキーマが宣言された後、データベースからデータを取得できません(mongoose + express + mongodb

    4. オブジェクトの配列で$lookupを使用する