MongoDB-从正则表达式提取数据

时间:2019-02-10 07:43:36

标签: regex mongodb mongodb-query aggregation-framework

我有一个作业,需要使用MongoDB从一些Twitter帖子中检索数据,并且已经有一个问题坐了几个小时了。 我需要提取提到的用户(在Twitter中,您@@ TheirUsername来提及他们),并且这样做很麻烦,我尝试使用substrCP,并找到“ @”开头的索引,但无法弄清楚如何找到“ @”停在哪里,因为名称的长度不同,并且名称结尾后可以有任何字符,例如“?”,“”。等

因此,我使用了正则表达式模式:/ @ \ w + /来查找该推文是否包含一个字符串,该字符串包含@符号,后跟一些单词。 找出推文中是否包含@Someone确实非常有效,但是我仍然不知道如何“提取”该推文。

(顺便说一句。我一直在使用聚合来做到这一点,所以我可以通过$ match,然后是$ project,最后是$ sort)来传递它

看起来像这样:

https://hastebin.com/adohogedil.bash

需要提取用户名的字符串的示例是:
“该死!@ white_cat22我错过了11:11”

我只需要“ @ white_cat22”部分。

编辑:稍作搜索之后,我认为一种更好的描述方法如下,我需要在被测试的字符串上检索匹配的正则表达式模式。

我该怎么做才能提取提到的用户名?任何帮助将不胜感激! (已编辑)

2 个答案:

答案 0 :(得分:0)

因此,您可以使用MongoDB查询运算符来实现所需的内容,例如:

{ username: { $regex: /@white_cat22/i } }

有关更多详细信息,请查看此link

答案 1 :(得分:0)

它有点棘手,您必须使用$split$unwind运算符,然后将$match@一起使用,如下所示:

db.tweets.aggregate([ 
    {
        $match: { tweet: /@\w+/ }
    }, 
    {
        $project: {tweet: {$split: ["$tweet", " "]}}
    }, 
    {
        $unwind: "$tweet"
    }, 
    {
        $match: { tweet: /@\w+/  }
    } 
])

它产生的结果,几乎与您的要求类似:

{ "_id" : ObjectId("5c61aee91765cd7b27eb473e"), "tweet" : "@white_cat22" }
{ "_id" : ObjectId("5c61aeee1765cd7b27eb473f"), "tweet" : "@white_cat23" }
{ "_id" : ObjectId("5c61aef61765cd7b27eb4740"), "tweet" : "@cat23" }
{ "_id" : ObjectId("5c61aefd1765cd7b27eb4741"), "tweet" : "@KP" }
{ "_id" : ObjectId("5c61af051765cd7b27eb4742"), "tweet" : "@kpTesting" }
{ "_id" : ObjectId("5c61af091765cd7b27eb4743"), "tweet" : "@kpTesting12" }
{ "_id" : ObjectId("5c61b4791765cd7b27eb4744"), "tweet" : "@kpTesting12" }

有关更多信息,我对上面使用的集合的简单查找查询是:

> db.tweets.find()
{ "_id" : ObjectId("5c61aee91765cd7b27eb473e"), "tweet" : "damnnn! @white_cat22 i missed 11:11" }
{ "_id" : ObjectId("5c61aeee1765cd7b27eb473f"), "tweet" : "damnnn! @white_cat23 i missed 11:11" }
{ "_id" : ObjectId("5c61aef61765cd7b27eb4740"), "tweet" : "damnnn! @cat23 i missed 11:11" }
{ "_id" : ObjectId("5c61aefd1765cd7b27eb4741"), "tweet" : "damnnn! @KP i missed 11:11" }
{ "_id" : ObjectId("5c61af051765cd7b27eb4742"), "tweet" : "damnnn! @kpTesting i missed 11:11" }
{ "_id" : ObjectId("5c61af091765cd7b27eb4743"), "tweet" : "damnnn! @kpTesting12 i missed 11:11" }
{ "_id" : ObjectId("5c61b4791765cd7b27eb4744"), "tweet" : "@kpTesting12 i missed 11:11" }
>

它也包含用户名,即@一词,如果该用户名出现在tweet句子的最后,它也将起作用。

这可能会有所帮助,但是您始终可以优化此查询,我在此处发布只是为了您的理解,我没有为您提供所需的优化解决方案。

有关更多详细信息,请检查以下参考资料:

$split (aggregation)

$unwind (aggregation)