Использовать $ match для полей из двух отдельных коллекций в агрегированном запросе mongodb - PullRequest
0 голосов
/ 05 июля 2019

У меня есть сводный запрос, где я присоединяюсь к 3 коллекциям.Я хотел бы отфильтровать поиск по полям из двух этих коллекций.Проблема в том, что я могу использовать $ match только для начальной коллекции, с которой mongoose инициализируется.

Вот запрос:

var pipeline = [
    {
        $lookup: {
            from: 'blurts',
            localField: 'followee',
            foreignField: 'author.id',
            as: 'followerBlurts'
        }
    },
    {
        $unwind: '$followerBlurts'
    },
    {
        $lookup: {
            from: 'users',
            localField: 'followee',
            foreignField: '_id',
            as: 'usertbl'
        }
    },
    {
        $unwind: '$usertbl'
    },
    {
        $match: {
            'follower': { $eq: req.user._id },
            //'blurtDate': { $gte: qryDateFrom, $lte: qryDateTo }
        }
    },
    {
        $sample: { 'size': 42 }
    },
    {
        $project: {
            _id: '$followerBlurts._id',
            name: '$usertbl.name',
            smImg: '$usertbl.smImg',
            text: '$followerBlurts.text',
            vote: '$followerBlurts.vote',
            blurtDate: '$followerBlurts.blurtDate',
            blurtImg: '$followerBlurts.blurtImg'
        }
    }
];

keystone.list('Follow').model.aggregate(pipeline)
.sort({blurtDate: -1})
.cursor().exec()
.toArray(function(err, data) {
    if (!err) {
        res.json(data);
    } else {
        console.log('Error getting following blurts --> ' + err);
    }
});

В конвейере я могу использовать только $совпадение по модели «Follow».Когда я использую $ match для модели Blurt, она просто игнорирует условие (вы можете увидеть, где я пытался включить его в закомментированную строку в $ match).

Что вызывает недоумение, так это то, что я могу использовать этополе в методе .sort, но не в условиях $ match.

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете использовать mongo точечную запись для доступа к элементам коллекции, которая просматривается с помощью $lookup.

https://docs.mongodb.com/manual/core/document/#dot-notation

Итак, вэтот случай followerBlurts.blurtDate должен дать вам значение, которое вы ищете.

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