【问题标题】:How would I fetch random pairs from mongodb我将如何从 mongodb 获取随机对
【发布时间】:2013-01-23 13:40:00
【问题描述】:

所以我有一个有趣的用例,我一直在努力寻找有效的 mongo 查询。

首先,我有 12,000 个类别和 100,000 个帖子。我需要从随机类别中随机选择 100 对帖子。这些对是从类别中随机选择的,但每对必须有两个帖子属于同一类别。

用户查看每一对进行评分,当他们看完 100 个后,他们会获取另外 100 个随机帖子(最好不是他们已经看过的任何相同对)。

所以要求是:

  • 从一组随机类别中随机获取 100 对帖子

可选要求:

  • 不要退回他们已经评价过的相同配对

Mongo 集合

  • 用户
  • 分类
  • 帖子
    • 类别 ID
    • 评分(帖子中嵌入集合)

我将如何在 Mongo 中执行此操作...如果更容易,我应该将其中一些数据从 mongo 移到另一个数据库吗?

【问题讨论】:

    标签: mongodb random random-sample


    【解决方案1】:

    是的。非常有趣的问题。我的建议是在您的邮寄文件上放置一个randomVal 字段。然后你可以对{CategoryId: 1, randomVal: 1}进行排序。结果将是一个游标,它按CategoryId 对所有帖子进行分组,但在该分组中是随机的。如果您从概念上将其视为一个数组,您可以选择所有偶数索引的帖子,并将它们与奇数邻居配对,以获得类别内唯一的随机对。

    我认为如何从这个列表中选择随机对需要一些实验,但我的直觉是最好的方法是有一个单独的过程,定期缓存一组按单独的 @ 排序的对987654324@。面向用户的查询一次只会增加 100 个这个对集合。

    【讨论】:

      【解决方案2】:

      我认为您可以通过两个查询来实现这一点。首先,您需要使用聚合框架并对 Posts 集合进行 map reduce 操作。在 map 阶段使用类别 id 作为 key 并将 post id 发送到 reducer。

      在 reduce 阶段,从每个类别中选择两个随机 id。在地图 reduce 的末尾,您将有一个Post id 的列表。然后从Posts 集合中检索这些帖子。

      ratedBy 字段添加到Post 文档,当用户对帖子进行评分时,将他或她的用户名添加到ratedBy 字段。然后首先将该字段用作 map reduce 命令的过滤器,这样您就不会将已评级的文档带给用户。

      祝你好运

      【讨论】:

      • 我怎么也随机呢?我不一定要扫描所有帖子或类别,所以有没有办法只抓取随机集?
      • 你的category和post的结构是什么,你如何识别一个category或者post,它们的id是什么类型?
      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多