/*Person model*/
{
name: {
first: String,
last: String
}
}
let regex = new RegExp(QUERY,'i');
Person.find({
$or: [
{'name.first': regex},
{'name.last': regex}
]
}).exec(function(err,persons){
console.log(persons);
});
如果我搜索John,就会得到结果(如果我搜索Jo,就会得到event)。但如果我搜索无名氏,显然没有任何结果。
如果我将查询更改为JohnDoe,我会得到结果,但它会返回所有在其最后/名字中有John或Doe的人。
接下来是尝试使用mongoose TextSearch:
PersonSchema.index({
name: {
first: 'text',
last: 'text'
}
},{
name: 'Personsearch index',
weights: {
name: {
first : 10,
last: 10
}
}
});
Person.find({
$text : {
$search : QUERY
}
},
{ score:{$meta:'textScore'} })
.sort({ score : { $meta : 'textScore' } })
.exec(function(err,persons){
console.log(persons);
});
有办法解决吗?
没有外部插件的答案是首选的,但其他的也是希望的。
您可以使用aggrege
管道来完成此操作,该管道使用$concat
将名字和姓氏串联在一起,然后根据其进行搜索:
let regex = new RegExp(QUERY,'i');
Person.aggregate([
// Project the concatenated full name along with the original doc
{$project: {fullname: {$concat: ['$name.first', ' ', '$name.last']}, doc: '$$ROOT'}},
{$match: {fullname: regex}}
], function(err, persons) {
// Extract the original doc from each item
persons = persons.map(function(item) { return item.doc; });
console.log(persons);
});
但是,性能是一个问题,因为它不能使用索引,所以需要进行完整的集合扫描。
您可以通过在$project
阶段之前使用$match
查询来减轻这种情况,该查询可以使用索引来减少管道其余部分需要查看的文档集。
{$match: $or: [
{'name.first': /^John/i},
{'name.last': /^John/i}
]}
带有Mongoose的MongoDB(3.2.0) 收藏: 用户 null 查询: =>找到 =>找到(搜索大小写敏感为false) =>找到(使用diacriticSensitive搜索为false) =>找到(部分搜索) =>未找到(部分搜索) =>未找到(部分搜索) 你知道为什么我用查询“Leo”或“L”得到0个结果吗? null
我试图实现与linq文本搜索。我有一个用电子邮件数据填充的消息表。我想能够在消息体中搜索。然而,电子邮件正文很长,我想只显示搜索文本的一小部分,例如,如果我搜索: 奥特 在以下案文中: 知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。但是,在最低限度上,我们需要一个实验室来进行日常工作。两人或两人在一个无教区的房间里互相指责。除偶尔因疏忽而死亡外,不得因疏忽而导致动物死亡。 结果应
我的mongoDB中有这种数据 这里假设我做一个查询 这给了我她的结果,但我有名字“nna”或名字“Ana”或名字“anna”或任何其他组合。那么,如何使用Mongoose获取MongoDB中字符串的最接近值呢
问题内容: 在我的查询中,我想找到与许多LIKE运算符之一匹配的行。我知道这样做的3种方法,但是只有其中一种可以使用索引。 让我们从表开始: 插入样本数据后,我可以执行以下操作: 以上查询正确使用索引。 第二种方式: 该查询将不使用索引。我知道的最后一种方法: 与上一个查询类似,该查询将不使用索引。 这是SQL Fiddle,适用于那些想如何使用这些查询的人:http : //sqlfiddl
问题内容: 我有mysql表,其中有一列将xml存储为字符串。我需要找到xml列包含给定6个字符的字符串的所有元组。没关系-我只需要知道这6个字符串是否存在即可。 因此,将文本格式设置为xml可能并不重要。 问题:如何在mysql中搜索?即 有没有一种方法可以使用LIKE运算符执行此操作? 问题答案: 您可能可以使用该子句进行一些简单的字符串匹配: 如果您需要更多高级功能,请在此处查看MySQL的
问题内容: 我正在发送此请求 我得到正确的结果 但是当我想按单词部分搜索时,例如 我没有得到任何结果: 我究竟做错了什么? 问题答案: 这是因为您的字段可能已由标准分析器(默认设置)进行了分析,并且标题已被标记为三个标记,并且。 为了搜索单词的任何子串,您需要创建一个自定义分析器,该分析器利用ngram令牌过滤器来索引每个令牌的所有子串。 您可以这样创建索引: 然后,您可以重新索引数据。这将使标题