通过正则表达式匹配计算 MongoDB 中的记录
Count records in MongoDB by regex match
我在数据库中有包含 URL 的记录。例如,https://www.youtube.com/watch?v=blablabla
.
我想计算每个站点的 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
}]
它甚至无法正确计算相同的字符串。
我的方法有什么问题?
这将统计所有网站:
网站名称由此正则表达式确定:
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}]
})
})
我在数据库中有包含 URL 的记录。例如,https://www.youtube.com/watch?v=blablabla
.
我想计算每个站点的 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
}]
它甚至无法正确计算相同的字符串。
我的方法有什么问题?
这将统计所有网站:
网站名称由此正则表达式确定:
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}]
})
})