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