关于mapreduce:MongoDB Group by / Map reduce | 珊瑚贝

MongoDB Group by / Map reduce


大家好,我在 mongoDB 中有一个现有的消息传递模式,它运行良好。

1
2
3
4
5
6
7
8
9
10
{      
   “_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,但这在这里应该无关紧要。

谢谢。


你可以通过from_user._id和user_id来使用group和group。

1
2
3
4
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”)})

这将返回奎因先生发消息的所有用户的列表,以及每个用户发消息的次数。确保您在 “from_user._id”

上有一个索引

  • 这将在 1 个方向上起作用(Quin 先生发送的所有消息),但它不会收到发送给 Quin 先生的消息(由”user_id”键指定。如果我将条件更改为 $ 或它确实接收传入的消息, 但没有正确分组。 db.messages.group({key: {user_id: 1, ‘from_user._id’: 1}, initial: {sum: 0}, reduce: function(doc, prev) {prev.sum += 1}, cond: {$or : [{‘from_user._id’: ObjectId(“4f4c6b6943658618dc000001”)}, {user_id: ObjectId(“4f4c6b6943658618dc000001”)}]}} \t\t\t\t) 这会返回一个重复的条目
  • 如果您想将所有消息发送给 Quin 先生,请将 cond 更改为 {user_id: ObjectId(“4f4c6b6943658618dc000001”)}。您将运行两个单独的组查询来获取关系的双方。
  • 是的,这就是问题所在,我不想在两个查询中使用它,因为我想列出所有按最近排序的消息。如果我在 2 个查询中完成,我需要在应用程序级别进行排序。但我想这暂时可行。非常感谢你的帮助。


来源:https://www.codenong.com/9628363/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9663.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?