пн goose рекурсивно найти элементы в дБ - PullRequest
1 голос
/ 09 марта 2020

Я пишу запрос, чтобы найти 'n' нет видео из коллекции. Я установил основной, вторичный и третичный языковые наборы пользователя (предположим, тамильский (P), хинди (S), английский sh (t)). Я хочу сначала найти видео на основном языке, если количество возвращаемых видео меньше 'n', чем поиск на дополнительном языке и, наконец, на третичном языке. Если на каком-либо этапе найдено n видео, то нет необходимости искать дальше. Я из c фона, поэтому я думаю использовать рекурсию, но есть ли способ найти видео в одном запросе.

1 Ответ

0 голосов
/ 09 марта 2020

вы можете сделать это следующим образом, при условии, что количество языков равно stati c.

var langs = ['hindi', 'tamil', 'english']; //arrange the languages in the priority you want
var limit = 5;

db.videos.aggregate(
    [
        {
            $group: {
                _id: null,
                vids: {
                    $push: '$$ROOT'
                }
            }
        },
        {
            $project: {
                vids: {
                    $concatArrays: [
                        {
                            $slice: [
                                {
                                    $filter: {
                                        input: "$vids",
                                        cond: { $eq: ["$$this.language", langs[0]] }
                                    }
                                }, limit
                            ]
                        },
                        {
                            $slice: [
                                {
                                    $filter: {
                                        input: "$vids",
                                        cond: { $eq: ["$$this.language", langs[1]] }
                                    }
                                }, limit
                            ]
                        },
                        {
                            $slice: [
                                {
                                    $filter: {
                                        input: "$vids",
                                        cond: { $eq: ["$$this.language", langs[2]] }
                                    }
                                }, limit
                            ]
                        }
                    ]
                }
            }
        },
        {
            $unwind: '$vids'
        },
        {
            $replaceWith: '$vids'
        },
        {
            $limit: limit
        }
    ])

. Обязательно добавьте индекс в поле языка.

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