MongoDB - 如何根据不同的标准获取数据

时间:2014-06-10 10:41:50

标签: mongodb nosql

我将用户社交媒体数据存储在mongo db中。我有用户集合,其中包含所有用户文档。在用户文档中,我想在Sports类别中存储他喜欢的所有页面。我在用户文档中将他喜欢的所有页面的数组存储为“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实现这一目标?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

你可以做到

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

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

答案 1 :(得分: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(分区)。分片是一个需要单独进行全新会话的主题,因此您需要先学习一个教程。