我有一组包含搜索词数组的文档,例如
[ "apples", "oranges", "bananas" ]
用户将输入关键字前缀的搜索字符串,并且我想匹配包含数组中每个术语的所有文档。因此,例如,“app oranges”将匹配上面的列表,但“applet oranges”不会。
使用$ regex构造一个$和查询来检查每个术语是否匹配数组中的一个项作为前缀是相当简单的,但是这还不够......
每个关键字在该集合中应该具有唯一匹配,以便搜索“apples app”与上面的列表不匹配,因为“app”术语与“apple”不匹配,因为“apple”已经匹配。这种约束导致了一个更微妙的问题。以此集为例:
[ "france", "fred", "freddy" ]
如果用户点击“fr france”,那么这应该匹配。重要的是“fr”的匹配不会从剩余关键字的可能术语列表中删除“france”,否则后面的“france”一词的测试将失败。
我需要将其实现为Mongo查询。我对Mongo很陌生,我不知道从哪里开始,甚至可能。可以吗?如果是这样,怎么样?
答案 0 :(得分:1)
首先,您可以使用$regex运算符来匹配文字模式:
var searchTerms = "app oranges".split(" ");
var arr = [];
searchTerms.forEach(function(i){
var reg = new RegExp("^"+i);
arr.push({"names":{$regex:reg}});
})
db.collection.find({$and:arr});
会为您提供包含数组names
的文档,其中包含以app
开头且包含oranges
的值。
每个关键字都应该在该集合中具有唯一匹配,以便搜索“apples app”与上面的列表不匹配,因为“app” 由于“苹果”已经存在,因此术语无法与“苹果”相匹配 匹配。这种约束导致了一个更微妙的问题。拿这套 例如:
此逻辑应在触发查询之前/之后在应用程序服务器中执行。如果用户输入的字符串是另一个以前输入的substring
,那么查询将失败,因为它已经与该fromer匹配。