猫鼬递归地在db中查找元素

时间:2020-03-09 09:24:53

标签: javascript node.js mongodb mongoose

我正在编写一个查询,以从集合中查找“ n”个视频。我已经设置了用户的主要,次要和第三语言集(假设泰米尔语(P),印地语(S),英语(t))。我想首先找到主要语言的视频,如果返回的视频少于“ n”,则从第二语言开始搜索,最后从第三语言开始搜索。如果在任何阶段找到n个视频,则无需进一步搜索。我来自c背景,因此我在考虑使用递归,但是有什么方法可以在一个查询中找到视频。

1 个答案:

答案 0 :(得分:0)

假设语言数量是静态的,您可以这样做。

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
        }
    ])

确保在“语言”字段上添加索引。