【问题标题】:MongoDB - How I can fetch data based on different criteriasMongoDB - 我如何根据不同的标准获取数据
【发布时间】:2017-07-06 08:22:54
【问题描述】:

我将用户社交媒体数据存储在 mongo db 中。我有包含所有用户文档的用户集合。在用户文档中,我想将他喜欢的所有页面存储在 Sports 类别中。我将他喜欢的所有页面的数组存储为用户文档中的“体育”键。 如果我想获得所有喜欢特定体育页面的用户,例如Sachin Tendulkar,我可以在 mongoDB 中使用 find() 来检索它,但它会搜索数百万个用户文档以获得结果。这会影响性能。

示例架构:

{
    name: "XYZ",
    Bday: "07/25/1990",
    email: "xyz@yahoo.com",
    location: "India",
    gender: "male",
    Sports: ["Sachin Tendulkar", "John Cena", "Federer", "Nadal", "Ronaldo",....]
}

我到底想要什么:

我想存储数据,以便我可以根据不同的标准(视图)获取信息。考虑一个立方体。立方体的一侧为我提供基于用户的数据,另一侧为我提供基于类别的信息等等。 如何使用 MongoDB 实现这一点?

提前致谢。

【问题讨论】:

  • 考虑您的问题。在这一点上,它危险地接近于寻求工具或产品的推荐,这不会被看好。尝试更具体地解决您的数据分析问题,然后您可能会得到一些帮助。
  • 感谢您的建议。
  • 还有一个建议。尝试一些示例数据来说明。即使是一个小样本。程序员喜欢用数据来解决问题。
  • 您对文档架构的描述很难理解。能否请您发布一个示例文档?
  • 我已经添加了文档样本。

标签: mongodb nosql


【解决方案1】:

您需要考虑两件事。

  • 索引:您需要为每个条件(视图)创建索引。例如,以下两个索引说明了两种可能的查询:

    db.users.ensureIndex({Sports:1});

这将在Sports 上创建索引,因此所有包含Sports 的查询都会很快:db.users.find({Sports:"Sachin Tendulkar"});

db.users.ensureIndex({location:1});

现在,location 上的任何查询也将非常快:db.users.find({location:"India"});

  • 如果您的集合变得很大,我的意思是,即使您对索引不满意,您也需要在多台机器上进行shard your collection(分区)。分片是一个需要一个全新会话的主题,因此您需要先阅读教程。

【讨论】:

    【解决方案2】:

    MongoDB 允许您在包含数组的字段上创建索引。在这种情况下,数组中的每个条目将被单独索引。所以当你这样做时:

    db.users.ensureIndex({Sports:1});
    

    你可以的

    db.users.find({Sports:"Federer"});
    

    您将使用仅索引查询在 Sports 数组中的任何位置获取具有该值的所有用户。

    【讨论】:

    • 这会照顾性能吗?因为系统中有数十亿用户。
    猜你喜欢
    • 2018-09-25
    • 2021-10-11
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多