MongoDB Group by / Map减少

时间:2012-03-09 03:01:32

标签: mongodb mapreduce mongoid

嘿伙计我在mongoDB中有一个现有的消息传递模式,效果很好。

{       
    "_id" : ObjectId("4f596b4543658618c0000004"),
    "user_id" : ObjectId("4f4c6c5143658618dc000002"),
    "body" : "message body",
    "from_user" : {
        "_id" : ObjectId("4f4c6b6943658618dc000001"),
        "name" : "Mister Quin"
    },
    "created_at" : ISODate("2012-03-09T02:30:29Z")
}

现在我想显示给定用户已发送消息的人员列表。您可以将其视为一个消息收件箱,它将消息我分别是“user_id”和“from_user._id”表示的发件人和收件人。因此,本质上是从消息集合中对两方之间的唯一消息进行分组。我能得到的任何帮助将不胜感激。我知道这可能是地图减少问题。

我使用mongoid作为我的ORM,但这在这里不应该太重要。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以按from_user._id和user_id使用组和组。

db.messages.group({key: {'from_user._id': 1, user_id: 1},
                   initial: {sum: 0}, 
                   reduce: function(doc, prev) {prev.sum += 1},
                   cond: {from_user._id: ObjectId("4f4c6b6943658618dc000001")})

这将返回由Mister Quin发送的所有用户的列表,以及每个用户发送消息的次数。确保你有“from_user._id”的索引