Javascript 按相关性排序性能问题

Javascript 按相关性排序性能问题,javascript,node.js,mongodb,mongoose,relevance,Javascript,Node.js,Mongodb,Mongoose,Relevance,mongoose(和或mongodb)中是否有函数/方法可用于根据相关性(匹配查询参数的最大数量)对查询结果进行排序 下面的示例是我目前正在使用的(查询在:[]中使用$in:[],否则相同)-我的集合非常小,因此性能很好,但在较大的集合中,它会显著降低速度 或者,如果有更好的执行方法(在mongoose/mongodb之外),我很乐意知道 例如: var docs = [ { fruits: ['apple', 'orange', 'tomato'], c

mongoose(和或mongodb)中是否有函数/方法可用于根据相关性(匹配查询参数的最大数量)对查询结果进行排序

下面的示例是我目前正在使用的(查询在:[]中使用
$in:[]
,否则相同)-我的集合非常小,因此性能很好,但在较大的集合中,它会显著降低速度

或者,如果有更好的执行方法(在mongoose/mongodb之外),我很乐意知道

例如:

var docs = [
    {
        fruits: ['apple', 'orange', 'tomato'],
        colors: ['blue', 'green'],
        // relevance: 3
    },
    {
        fruits: ['apple', 'carrot'],
        colors: ['red', 'green'],
        // relevance: 2
    }
]

var query = {fruits: ['apple', 'orange'], colors: ['green']}

docs.forEach(function(doc){
    var relevance = 0
    Object.keys(query).forEach(function(_query){
        var arrays = [doc[_query], query[_query]]
        var result = arrays.shift().filter(function(v) {
            return arrays.every(function(a) {
                return a.indexOf(v) !== -1;
            });
        });
        relevance += result.length
    })
    doc.relevance = relevance
})
结果:

var docs = [
    {
        fruits: ['apple', 'orange', 'tomato'],
        colors: ['blue', 'green'],
        relevance: 3
    },
    {
        fruits: ['apple', 'carrot'],
        colors: ['red', 'green'],
        relevance: 2
    }
]

您可以通过聚合来实现这一点:

db.getCollection('docs').aggregate([
{$match:{水果:{$in:['apple','orange']},颜色:{$in:['green']}},
{$项目:{
相关性:{
$sum:[
{$cond:{if:{“$setIsSubset”:[['orange'],“$fruits”]},然后:1,否则:0},
{$cond:{如果:{“$setIsSubset”:[['apple'],“$fruits”]},那么:1,否则:0},
{$cond:{如果:{“$setIsSubset”:[['green'],“$colors”]},那么:1,否则:0}]
},
文档:“$$ROOT”}

])
还可以添加预期的输出吗?使用
数组.shift()
数组。总是包含两个项目的数组上的每个
几乎没有意义。@Bergi查询中可能会使用十几个数组,使用
.shift()
.every()
是一个动态生成的查询。@Bergi我理解你所说的
.shift(),.every()
-不知道为什么我认为需要它。@Bergi当时的数组是
[docs[0].fruits]
,即
[[['apple','orange']]
。我错过了外部数组,认为每个数组都在迭代
['apple','orange']