任何人都可以解释一下之间的区别:
db.collection.find({ $text: { $search: "dog cat" } })
和
Product.find({ "drug": { "$regex": "cols", "$options": "i" } })
我们应该什么时候去哪一个?
答案 0 :(得分:3)
为查询中的模式匹配字符串提供正则表达式功能。 MongoDB使用Perl兼容的正则表达式(即“PCRE”)版本8.36,支持UTF-8。
对使用text index索引的字段的内容执行文本搜索。
对于数据
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }
要搜索单字符串值的字段sku
,可以使用$regex
db.products.find( { sku: { $regex: /^ABC/i } } )
虽然搜索字段description
是文本内容值,但可以使用$text
,当然,我们应首先在description
上构建文本索引。
db.products.find( { $text: { $search: "coffee" } } )
为什么不只有正则表达式?
regular expressions
有其自然限制,因为它们缺少任何词干功能,无法以微不足道的方式处理“action -superhero”
等方便的搜索查询。 这是一个link来比较它们。
答案 1 :(得分:3)
嗯,正则表达式和文本搜索($ text)都可以帮助您非常有效地搜索文本。两者都有各自的优缺点,但有两个明显的区别
<强>正则表达式强>
除非您使用^
运算符在字符串的开头搜索,否则正则表达式不会利用索引。
正则表达式允许您搜索部分文本。因此。*以及许多其他模式。
正则表达式不支持停止或干扰词。
mongodb中的<强> $文本强>
文本索引非常快,应该是首选。但是,MongoDB不实现全功能文本索引。一个主要缺点是,它不支持部分匹配。例如如果你正在寻找猫,它将只搜寻猫和猫,但不会搜索山猫或蚂蚱。
底线是,如果您希望实现像RDBMS
like
运算符这样的功能,'$ text'将无法帮助您(至少在MongoDB的当前实现中,但将来它可能会更改)。