MongoDB子串匹配查询

时间:2012-04-22 03:42:57

标签: ruby-on-rails string mongodb substring

我的应用程序正在尝试将传入字符串与Mongo数据库中的文档进行匹配,其中字段包含关键字列表。目标是查看字符串中是否存在关键字。

以下是一个例子:

传入字符串:

"John Doe is from Florida and is a fan of American Express"

MongoDB中文档的字段具有如下值:

in_words: "georgia,american express"

因此,数据库记录的单词或关键字由comman分隔,其中一些是两个或更多单词。

目前,我的RoR应用程序提取文档并为每个文档提取单词,在单词上发出split(',')命令,然后遍历每个文档并查看它是否存在于字符串中。

我真的想找到一种方法将这种类型的搜索推送到实际的数据库查询中,以加快处理速度。我可以将数据库中的in_words更改为如下数组:

in_words: ["georgia", "american express"] 

但我仍然不确定如何查询?

总结一下,我的目标是通过比较该人的关键字/关键字列表与传入字符串来找到匹配传入字符串的人。并在数据库层中进行全部查询。

提前感谢您的建议

2 个答案:

答案 0 :(得分:1)

作为第一步,你绝对应该将in_words分成一个数组。

您的查询仍然很棘手。

接下来考虑对该数组字段使用$regex查询。

构造正则表达式会有点困难,因为你想匹配输入字符串中的任何一个单词,或者,它出现任何一对作品(多少个单词?)。关于如何从我的博客条目here构建合适的正则表达式,您可能会得到一些进一步的想法,其中我将输入字符串的子字符串与数据库匹配(正常LIKE操作的反转)。

答案 1 :(得分:0)

您可以通过将长字符串拆分为单独的标记并将它们放入单独的数组中来解决此问题。并使用$all查询有效地查找匹配的关键字。

查看样本

> db.splitter.insert({tags:'John Doe is from Florida and is a fan of American Express'.split(' ')})
> db.splitter.insert({tags:'John Doe is a super man'.split(' ')})
> db.splitter.insert({tags:'John cena is a dummy'.split(' ')})
> db.splitter.insert({tags:'the rock rocks'.split(' ')})

以及查询时

> db.splitter.find({tags:{$all:['John','Doe']}})

它将返回

> db.splitter.find({tags:{$all:['John','Doe']}})
{ "_id" : ObjectId("4f9435fa3dd9f18b05e6e330"), "tags" : [  "John",     "Doe",  "is",   "from",     "Florida",  "and",  "is",   "a",    "fan",  "of",   "American",     "Express" ] }
{ "_id" : ObjectId("4f9436083dd9f18b05e6e331"), "tags" : [ "John", "Doe", "is", "a", "super", "man" ] }

请记住,此操作区分大小写。

如果您要查找部分匹配,请使用$in代替$all

此外,您可能需要在插入前删除干扰词('a','the','is'...)以获得准确的结果。

我希望很清楚