агрегация mongodb с массивом и поиском - PullRequest
1 голос
/ 27 марта 2019

У меня есть коллекция MongoDB с документами в следующем формате: имя коллекции, называемое post

{
    "_id" : ObjectId("5c88b225fac24431d947abad"),
    "user_id" : "5c87ad6c623f1e2bd4d041d0",
    "post_likes" : [ 
        {
            "post_user_id" : "5c87ad6c623f1e2bd4d041d0",
            "like_status" : true
        }, 
        {
            "post_user_id" : "5c88b42b71611926c055508b",
            "like_status" : true
        }
    ],
    "post_comments" : [ 
        {
            "comment_user_id" : "5c87ad6c623f1e2bd4d041d0",
            "comment_like" : "",
            "comment_description" : ""
        }, 
        {
            "comment_user_id" : "5c88b42b71611926c055508b",
            "comment_like" : "",
            "comment_description" : "nice post"
        }
    ]
}

У меня есть другое имя коллекции, называемое user_ptofile_info

{
    "_id" : ObjectId("5c923682c088564cf01056cb"),
    "user_id" : "5c87ad6c623f1e2bd4d041d0",
    "image_url" : "image/url",
    "user_name":"xxxxxxxx",
    "created_at" : "",
    "updated_at" : ""
}

Запрошенный вывод, например,
примечание: post_user_id из user_ptofile_info и user_id из записи являются поисковыми, и мне нужно общее количество для post_likes, а также оставлять комментарии также

{
    "_id" : ObjectId("5c88b225fac24431d947abad"),
    "user_id" : "5c87ad6c623f1e2bd4d041d0",
    "post_likes" : [ 
        {
            "post_user_id" : "5c87ad6c623f1e2bd4d041d0",
            "like_status" : true,
            "image_url" : "image/url",
            "user_name":"xxxxxxxx",
        }, 
        {
            "post_user_id" : "5c88b42b71611926c055508b",
            "like_status" : true,
            "image_url" : "image/url",
            "user_name":"xxxxxxxx",
        }
    ],
    "post_comments" : [ 
        {
            "comment_user_id" : "5c87ad6c623f1e2bd4d041d0",
            "comment_like" : "",
            "comment_description" : ""
        }, 
        {
            "comment_user_id" : "5c88b42b71611926c055508b",
            "comment_like" : "",
            "comment_description" : "nice post"
        }
    ]
}

1 Ответ

1 голос
/ 27 марта 2019

Вы можете использовать ниже агрегации:

db.post.aggregate([
    {
        $lookup: {
            from: "user_profile_info",
            let: { user_ids: "$post_likes.post_user_id" },
            pipeline: [
                { $match: { $expr: { $in: [ "$user_id", "$$user_ids" ] } } },
                { 
                    $project: {
                        post_user_id: "$user_id",
                        image_url: 1,
                        user_name: 1                        
                    }  
                }
            ],
            as: "users"
        }
    },
    {
        $project: {
            _id: 1,
            user_id: 1,
            post_likes: {
                $map: {
                    input: "$users",
                    as: "user",
                    in: {
                        post_user_id: "$$user.post_user_id",
                        image_url: "$$user.image_url",
                        user_name: "$$user.user_name",
                        like_status: {
                            $let: { 
                                vars: { 
                                    like: { 
                                        $arrayElemAt: [ 
                                            { $filter: { input: "$post_likes", as: "pl", cond: { $eq: [ "$$pl.post_user_id", "$$user.post_user_id" ] } } }, 0 
                                        ] 
                                    } 
                                },
                                in: "$$like.like_status"
                            }
                        }
                    }
                }
            },
            post_comments: 1
        }
    }
])

$ lookup с пользовательским конвейером (MongoDB 3.6 или новее) позволит вам получать данные из user_profile_info для всех пользователей, присутствующих в массиве post_likes. Затем вам нужно «объединить» массив users с post_likes, чтобы получить like_status. Поскольку у вас есть два массива, и вы знаете, что в обоих из них появляется один и тот же post_user_id, вы можете использовать $ map с $ arrayElemAt и $ filter для объединения данные из обоих массивов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...