Как я могу «объединить» запросы в Mongoose? - PullRequest
0 голосов
/ 23 января 2019

У меня возникли некоторые логические проблемы с двумя запросами, которые я делаю в mongoose. У меня два запроса, и я хочу «объединить их». Первый запрос принимает неанонимные опросы , второй - анонимные опросы . Разница в том, что в первом я выбираю поле "author" , а во втором я не выбираю поле "author" .

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

Итак, это запросы:

let notAnonymousPolls = await Poll.find({toUser: user.id, anonymous: false, status: ["closed", "opened", "hidden", "waitingResponse"]})
                .populate([
                    {path: "replies", select: "text"}, {path: "author", select: "username"}, {path: "replySelected", select: "_id"}
                    ])
                .select({"__v": 0});

второй

let anonymousPolls = await Poll.find({toUser: user.id, anonymous: true, status: ["closed", "opened", "hidden", "waitingResponse"]})
            .populate([
                {path: "replies", select: "text"}, {path: "replySelected", select: "_id"}
                ])
            .select({"author": 0, "__v": 0});

Моя проблема заключается в следующем: как я могу сказать Mongoose , чтобы выбрать автора, если анонимное поле имеет значение false , иначе не выбирать автора, если анонимное поле имеет значение true ?

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

О нумерации страниц: если у меня один запрос, все просто. Если у меня есть два запроса, как я могу сделать нумерацию страниц? С оператором $ slice?

1 Ответ

0 голосов
/ 24 января 2019

Через день я решил свою проблему .Кто-то может судить об агрегации, если она эффективна или нет (и если что-то не так, дайте мне совет)?

allPolls = await Poll.aggregate([
            {
                $match: {
                    "toUser": ObjectID(user.id),
                    $or: [
                        {status: "opened"},
                        {status: "closed"},
                        {status: "hidden"},
                        {status: "waitingResponse"}
                    ]
                }
            },
            {
                $lookup: {
                    "from": "replies",
                    "localField": "replies",
                    "foreignField": "_id",
                    "as": "replies"
                }
            },
            {
                $lookup: {
                    "from": "replies",
                    "localField": "replySelected",
                    "foreignField": "_id",
                    "as": "selectedReply"
                }
            },
            {
              $lookup: {
                  "from": "users",
                  "localField": "author",
                  "foreignField": "_id",
                  "as": "creator"
              }
            },
            {
                $project: {
                    status: 1,
                    toUser: 1,
                    _id: 1,
                    createdAt: 1,
                    question: 1,
                    replies: 1,
                    anonymous: 1,
                    "replySelected._id": 1,
                    "author.username": {
                        $cond: {
                            if: "$anonymous", then: null, else : "$creator.username"
                        }
                    },
                    "author._id": {
                        $cond: {
                            if: "$anonymous", then: null, else : "$creator._id"
                        }
                    },
                }
            },
            {
                $skip: 0
            },
            {
                $limit: 2
            }

        ]);

(я пробовал с фиксированным пропуском / лимитом)

...