您好,我是MongoDb的初学者。我有一个IRC聊天记录的数据库。文档结构非常简单
{
"_id" : ObjectId("000"),
"user" : "username",
"message" : "foobar foobar potato idontknow",
"time" : NumberLong(1451775601469)
}
我有成千上万的这些,我想计算字符串" foobar"的出现次数。我搜索了这个问题并找到了有关聚合的内容。我看起来非常复杂,我还没有真正发现任何这个问题"简单"。如果有人指出我正确的方向研究什么,我会很高兴,我不会想到一个完全符合我想要的示例命令。谢谢。
答案 0 :(得分:0)
没有任何内置运算符可以解决您的请求。
您可以尝试此查询,但效果非常差:
db.chat.find().forEach(function(doc){
print(doc["user"] + " > " + ((doc["message"].match(/foobar/g) || []).length))
})
如果您可以将message
字段更改为数组,那么我们可以应用aggregation
...
修改强>
如果您在条目中添加分割字词数组,我们可以应用汇总
样品:
{
"_id" : ObjectId("569bb7040586bcb40f7d2539"),
"user" : "username",
"fullmessage" : "foobar foobar potato idontknow",
"message" : [
"foobar",
"foobar",
"potato",
"idontknow"
],
"time" : NumberLong(1451775601469)
}
聚合。我们为每个数组元素创建新条目,匹配给定的单词(在这种情况下为foobar),然后计算匹配的结果。
db.chat.aggregate([
{"$unwind" : "$message"},
{"$match" : {"message" : {"$regex" : "foobar", "$options" : "i"}}},
{"$group" : {_id:{"_id" : "$_id", "user" : "$user", "time" : "$time", "fullmessage" : "$fullmessage"}, "count" : {$sum:1}}},
{"$project" : {_id:"$_id._id", "user" : "$_id.user", "time" : "$_id.time", "fullmessage" : "$_id.fullmessage", "count" : "$count"}}
])
结果:
[
{
"_id" : ObjectId("569bb7040586bcb40f7d2539"),
"count" : 2,
"user" : "username",
"time" : NumberLong(1451775601469),
"fullmessage" : "foobar foobar potato idontknow"
}
]