我有一个包含名为 searchTerms 的字段的 mongo 文档。这是一个包含单词的数组,例如["term1","term2", "term3","term4"]
我想编写一个按相关性返回文档的函数。这意味着在 searchCriteria 中具有最多搜索词的文档将首先出现在下一个最高数量的词等之后。
例子:
文件:
{"_id":"1", "searchTerms":["a","b","c","d"]}
{"_id":"2", "searchTerms":["a","b","x","q"]}
{"_id":"3", "searchTerms":["a","e","x","n"]}
{"_id":"4", "searchTerms":["e","f","g","z"]}
对于搜索词:["a","b","c"],结果应该是:
{"_id":"1", "searchTerms":["a","b","c","d"]}
{"_id":"2", "searchTerms":["a","b","x","q"]}
{"_id":"3", "searchTerms":["a","e","x","n"]}
我已经编写了一个函数来执行此操作,但是它非常复杂而且我认为效率很低。我正在阅读有关 map reduce 的内容,想知道在这种情况下它是否有帮助?我绞尽脑汁想弄清楚如何做到这一点。我不确定它是否可以?如果是,有人可以告诉我它是如何工作的吗?
最佳答案
一个简单的集合运算符就足够了。使用 $setIntersection 与输入数组和相交数组的 $project $size 进行比较。 $按大小降序排序并投影最终响应。
aggregate([{
"$project": {
"_id":0,
"fields" : "$$ROOT",
"matches": {
"$size": {
"$setIntersection": [
"$searchTerms", ["a", "b"]
]
}
}
}
}, {
"$sort": {
"matches": -1
}
}])
关于mongodb map reduce 用于搜索条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40754524/