Javascript 按相关性排序性能问题
mongoose(和或mongodb)中是否有函数/方法可用于根据相关性(匹配查询参数的最大数量)对查询结果进行排序 下面的示例是我目前正在使用的(查询在:[]中使用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
$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']
。