2017-02-21 36 views
3

У меня есть записи в базе данных, содержащей URL-адреса. Например, https://www.youtube.com/watch?v=blablabla.Записи счетчика в MongoDB по регулярному выражению

Я хочу подсчитывать URL-адреса для каждого сайта. Например

[{ 
    site: 'youtube.com', 
    count: 25 
}, 
{ 
    site: 'facebook.com', 
    count: 135 
}] 

Я использовал этот трубопровод агрегации:

db.getCollection('records').aggregate([ 
    {'$match': {'url': /.*youtube\.com.*/}}, // youtube for example 
    {'$group': {'_id': {'site': '$url', 'count': {'$sum': 1}}}}, 
    {'$project': {'_id': false, 'site': '$_id.site', 'count': '$_id.count'}} 
]); 

, который выводит:

[{ 
    "site" : "youtube.com/blablabla1", 
    "count" : 1.0 
}, 
{ 
    "site" : "youtube.com", 
    "count" : 1.0 
}, 
{ 
    "site" : "www.youtube.com/blablabla2", 
    "count" : 1.0 
}, 
{ 
    "site" : "www.youtube.com/blablabla1", 
    "count" : 1.0 
}] 

Это не будет даже рассчитывать одинаковые строки корректно.

Что не так с моим подходом?

+0

Airece вы пробовали мой ответ? –

+0

@MaciejKozieja Я пытаюсь понять это :) –

+0

Если это сработало для вас, пожалуйста, примите ответ;) –

ответ

1

Это сосчитать все сайты:

Имя Сайт детерминированными этим регулярным выражением:

const testData = ['https://www.youtube.com/watch?v=UbQgXeY_zi4&list=RDUbQgXeY_zi4&index=1', 'https://www.facebook.com/maciej.kozieja.9', 'http://example.com', 'http://www.example.com'] 

const sites = testData.map(site => (site + '/').match(/(?:https?:\/\/)?(?:www\.)?([\w.]+)(?=\/)/)[1]) 

console.log(sites) 

Тогда мы необходимо использовать функцию mapReduce на нашем угле:

db.collection('links').mapReduce(
    function() { 
     emit((this.site + '/').match(/(?:https?:\/\/)?(?:www\.)?([\w.]+)(?=\/)/)[1], 1) 
    }, 
    function (key, values) { 
     return values.length 
    }, { out: 'websiteLinksCount' } 
) 

, то мы можем сделать что-то с его

.then(x => { 
    x.find({}).toArray((error, x) => { 
     console.log(x) // here you have array of [{_id: siteName, value: count}] 
    }) 
}) 
+0

извините за свою долгую задержку, я переключился на другую задачу. он работает, но нуждается в некоторых версиях регулярных выражений. например, считать одинаковыми 'http: // example.com' и' example.com'. можно выбрать группу регулярных выражений? –

+0

Из того, что я помню, он работает так, как вы хотите –

+0

О, я вижу без www. –

-1

Если вы хотите подсчитать URL-адреса на сайте попробуйте использовать это:

const countSite = site => 
    db.getCollection('records').count({site: new RegExp(`.*${site.replace(/([.])/g, '\\$1').replace(/\//g, '\\/')}}.*`)}) 

const yt = countSite('youtube.com') 
const fb = countSite('facebook.com') 
+0

Это должно быть правильно, если я знаю, какие сайты exaccty присутствуют в базе данных. Но на самом деле я не. Мне нужно определить, какие сайты присутствуют, и подсчитывать URL-адреса на сайт. Я думал, что это возможно Монго. –

+0

@AireceKotina Я вижу, плохо смотрю на него, когда он вернулся домой –