MongoDB - извлечение данных из регулярных выражений - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть задание, в котором мне нужно получить данные из некоторых постов в твиттере с помощью MongoDB, и я уже несколько часов занимаюсь проблемой.Мне нужно извлечь упомянутого пользователя (в Твиттере вы @TheirUsername упоминаете его), и мне трудно это сделать, я попытался использовать substrCP и найти индексы для того, где начинается "@", но не могу понятькак найти точку «@», так как имена имеют разную длину, и после окончания имени может быть любой символ, например «?», «.»и т.д.

Поэтому я использовал шаблон регулярного выражения: / @ \ w + /, чтобы выяснить, есть ли в твите строка символов, включающая символ @, за которым следует какое-то слово.Это очень хорошо помогает выяснить, есть ли в твите @Someone, но я до сих пор не могу понять, как его «извлечь».

(Кстати. Я использовал агрегат, чтобы сделать это, поэтомуЯ мог бы передать это через $ match, затем $ project и, наконец, $ sort)

Выглядит примерно так:

https://hastebin.com/adohogedil.bash

Пример строки, которая нуждаетсячтобы извлечь имя пользователя:
"damnnn! @ white_cat22, я пропустил 11:11"

Где мне нужна только часть "@ white_cat22".

РЕДАКТИРОВАТЬ: после небольшого приближения,Я думаю, что лучший способ описать это следующим образом: мне нужно получить соответствующий шаблон регулярного выражения для строки, на которой выполняется тестирование.

Что я могу сделать, чтобы извлечь упомянутое имя пользователя?Любая помощь будет принята с благодарностью!(отредактировано)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Это немного хитро, вы должны использовать операторы $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 (агрегация)

$ раскрутка (агрегация)

0 голосов
/ 10 февраля 2019

Таким образом, вы можете использовать оператор запроса MongoDB для достижения того, что вы хотите, например:

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

Для получения более подробной информации, проверьте эту ссылку

...