Lookup VS Lookup с конвейером MongoDB (Performace & Как это работает внутри) - PullRequest
0 голосов
/ 24 марта 2020

Я делаю блог и у меня есть вопрос, который даст мне лучшую производительность, простой поиск или поиск с конвейером, потому что иногда простой поиск дал мне быстрый результат, а иногда поиск по пиплелию. Итак, я немного запутался, какой использовать или где использовать. Предположим, у меня есть 2 коллекции, пользователь и коллекция комментариев.

// Users Collection
{
   _id: "MONGO_OBJECT_ID",
   userName: "Web Alchemist"
}
// Comments Collection
{
   _id: "MONGO_OBJECT_ID",
   userId: "USER_MONGO_OBJECT_ID",
   isActive: "YES", // YES or NO
   comment: "xyz"
}

Теперь я хочу выполнить поиск из коллекции пользователей в комментариях, какой из них будет лучше для этого. Я сделал два запроса, которые дали мне тот же результат.

[
    {
        $match: { _id: ObjectId("5d68c019c7d56410cc33b01a") }
    },
    {
        $lookup: {
            from: "comments",
            as: "comments",
            localField: "_id",
            foreignField: "userId"
        }
    },
    {
        $unwind: "$comments"
    },
    {
        $match: {
            "comments.isActive": "YES"
        }
    }, 
    { $limit: 5},
    {
        _id: 1, userName: 1, comments: { _id: "$comments._id", comment: "$comments.comment"}
    },
    {
        $group: {
            _id: "$_id",
            userName: { '$first': '$userName' },
            comments: { $addToSet: "comments"}
        }
    }
]

ИЛИ

[
    {
        $match: { _id: ObjectId("5d68c019c7d56410cc33b01a") }
    },
    {
        $lookup: {
            from: "comments",
            as: "comments",
            let: { userId: "$_id" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $and: [
                                { $eq: ['$userId', '$$userId'] },
                                { $eq: ['$isActive', 'YES'] }
                            ]
                        }
                    }
                },
                { limit: 5 },
                {
                    $project: { _id: 1, comment: 1 }
                }
            ]
        }
    }
]
...