我正在写一个查询来查找收藏中的视频“n‘no”。我设置了用户的初级、中级和三级语言集(假设泰米尔语(P)、印地语(S)、英语(T))。我想先找到主要语言的视频,如果返回的视频小于“n”,那么从第二语言搜索,最后从第三语言搜索。如果在任何阶段找到n个视频,那么就不需要进一步搜索。我来自c背景,所以我正在考虑使用递归,但是有什么方法可以在一个查询中找到视频。
发布于 2020-03-09 10:28:19
假设语言数量是静态的,您可以这样做。
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
}
])确保在语言字段中添加索引。
https://stackoverflow.com/questions/60597652
复制相似问题