【问题标题】:MongoDB - Extract Data from RegexMongoDB - 从正则表达式中提取数据
【发布时间】:2019-02-10 07:43:35
【问题描述】:

我有一个任务,我需要使用 MongoDB 从一些 twitter 帖子中检索数据,并且已经解决了几个小时的问题。 我需要提取提到的用户(在 Twitter 中你 @TheirUsername 来提及他们),并且很难这样做,我尝试使用 substrCP,并找到“@”开始位置的索引,但无法弄清楚如何找到“@”停止的位置,因为名称有不同的长度,并且名称后可以有任何字符,例如“?”,“。”等等

因此,我使用正则表达式模式:/@\w+/ 来确定推文是否有包含@符号的字符串,后跟一些单词。 这在确定推文中是否包含@Someone 非常有效,但我仍然无法弄清楚如何“提取”它。

(顺便说一句。我一直在使用聚合来执行此操作,因此我可以通过 $match、$project 和最后 $sort 进行管道传输)

看起来像这样:

https://hastebin.com/adohogedil.bash

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

我只想要“@white_cat22”部分。

编辑:在谷歌上搜索了一下,我认为描述它的更好方法如下,我需要在正在测试的字符串上检索匹配的正则表达式模式。

我可以做些什么来提取提到的用户名?任何帮助将不胜感激! (已编辑)

【问题讨论】:

  • 你试过from here的解决方案了吗?另一个post 看起来也很有帮助。

标签: regex mongodb mongodb-query aggregation-framework


【解决方案1】:

所以你可以使用MongoDB查询运算符来实现你想要的比如:

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

更多详情,请查看link

【讨论】:

    【解决方案2】:

    有点棘手,您必须使用$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" }
    >
    

    它也包含用户名,即@,如果用户名出现在推文的最后一个句子中,它也可以工作。

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

    更多详情请查看以下参考资料:

    $split (aggregation)

    $unwind (aggregation)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2019-05-13
      • 2010-11-27
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多