在某个ID字段中,我们在文档上建立索引如下所示: 1234 45676
我们希望能够对两组数字中的每一组进行全文搜索,就像它们是字符串一样。我用引号中的数字组转义,mongo文档说这将确保搜索整个字符串。
例如,如果索引字段包含单词" blue"在其中,只有" blue"将被搜索。搜索" b"不会受到打击。 (我们暂时使用非干式搜索)。
但这不是数字组的结果。即使我们使用引号(" 45676")转义我们的数字组,数字组也会进行通配符搜索。在我们的示例中,搜索" 4"将击中" 45676"。
我们如何确保" 45676"被视为一个字符串,仅当" 45676"被搜索?
欢迎所有建议或观点!提前谢谢。
答案 0 :(得分:1)
有两种解决方案可以将一组数字作为唯一的单个单词进行搜索。
1)使用$ text运算符和文本索引
2)使用$ regexp运算符或正则表达式。
db = connect("test"); // same as `use test;`
db.a.drop();
db.a.insert([
{ _id: 1, txt : "Log 1: Page 23 1234 45676" },
{ _id: 2, txt : "Log 2: Page 45 0000 00000" },
{ _id: 3, txt : "Log 3: Page 59 1337 11111" }
]);
db.a.ensureIndex({ txt : "text" });
db.a.find({ $text : { $search : "45" } });
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
请注意,即使输出包含45676
,输出也不会返回带有_id 1的文档。
对于正则表达式,您需要将数字包装在单词边界\b
中,以避免它们在字符串中匹配。
实施例:
搜索没有字边界的4
。
/4/.test("4") == true
/4/.test("1234") == true
使用字边界搜索4
。
/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false
db.a.find({ txt : /\b45\b/ });
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
您可以使用以下功能从用户输入中形成正则表达式。
function escapeRegExp(str) {
return String(str).replace(/[[\]/{}()*+?.\^$|-]/g, "\\$&");
}
function wordToRegExp( query ){
return new RegExp( "\\b" + escapeRegExp( query ) + "\\b" );
}
var queryForWord = wordToRegExp( 45 );
// queryForWord would be sent from your server side, not created in mongo shell.
db.a.find({ txt : queryForWord });
更多信息: