Mongodb: найти одну статью для каждого автора ID - PullRequest
0 голосов
/ 23 июня 2018

У меня есть пользователь с массивом авторов, за которым он следит, например:

"authors" : [
    ObjectId("5a66d368486631e55a4ed05c"), 
    ObjectId("5a6765f5486631e55a564ae2")
]

И у меня есть статьи с идентификатором автора, например:

"authorId" : ObjectId("5a66d368486631e55a4ed05c"), 

Я хочу получить последнюю статью для каждого автора без многократных обращений к базе данных с рекурсивностью.

Некоторые идеи?

PD: я использую драйвер mongodb, я не хочу использовать mongoose для этого, спасибо

1 Ответ

0 голосов
/ 23 июня 2018

В MongoDB v 3.6 вы можете использовать пользовательские конвейеры для оператора $ lookup . В вашем случае вы можете использовать $ in в $match stage, чтобы получить соответствующие статьи, а затем $ group эти статьи по authorId и взять последнюю (используя $sort и $last операторов). Вы можете добавить $ replaceRoot , чтобы получить начальную форму из коллекции articles.

db.user.aggregate([
    {
        $match: { userId: "some user Id" } 
    },
    {
        $lookup: {
            from: "articles",
            let: { authors: "$authors" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $in: [ "$authorId",  "$$authors" ]
                        }
                    }
                },
                {
                    $sort: { createdAt: -1 }
                },
                {
                    $group: {
                        _id: "$authorId",
                        article: { $first: "$$ROOT" }
                    }
                },
                {
                    $replaceRoot: { newRoot: "$article" }
                }
            ],
            as: "articles"
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...