有两种解决方案可以将一组数字作为唯一的单词进行搜索。
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" }
]);
1. 使用 $text 运算符的示例
索引可搜索字段
db.a.ensureIndex({ txt : "text" });
使用 $text 运算符进行查询
db.a.find({ $text : { $search : "45" } });
输出
{ _id: 2, txt : "Log 2: Page 45 0000 00000" }
请注意,输出不会返回 _id 为 1 的文档,即使它包含45676
.
2. 使用正则表达式的例子
对于正则表达式,您需要将数字包装在单词边界中\b
,以避免它们在字符串中匹配。
示例:搜索4
没有单词边界。
/4/.test("4") == true
/4/.test("1234") == true
4
使用单词边界搜索。
/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false
使用正则表达式搜索 45
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 });
更多信息: