MongoDB计算集合

时间:2016-01-16 15:48:15

标签: mongodb database nosql

您好,我是MongoDb的初学者。我有一个IRC聊天记录的数据库。文档结构非常简单

{ 
    "_id" : ObjectId("000"), 
    "user" : "username", 
    "message" : "foobar foobar potato idontknow", 
    "time" : NumberLong(1451775601469)
}

我有成千上万的这些,我想计算字符串" foobar"的出现次数。我搜索了这个问题并找到了有关聚合的内容。我看起来非常复杂,我还没有真正发现任何这个问题"简单"。如果有人指出我正确的方向研究什么,我会很高兴,我不会想到一个完全符合我想要的示例命令。谢谢。

1 个答案:

答案 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"
    }
]