提高此MongoDB查询的性能

时间:2014-09-24 08:43:53

标签: node.js mongodb mongodb-query

我有一个包含相当大嵌入式数组的MongoDB文档:

name : "my-dataset"
data : [ 
          {country : "A", province: "B", year : 1990, value: 200}
          ... 150 000 more 
       ]

我们假设我要返回country ==“A”的数据对象。

  1. 这样做的正确方法是什么,例如通过NodeJ?

  2. 鉴于150个条目有200个匹配项,查询需要多长时间?

  3. 将数据存储为文档并将名称存储为每个文档的属性会更好(性能/结构方面)吗?

  4. 使用Mysql会更有效吗? )

2 个答案:

答案 0 :(得分:1)

A)只需查询它们即可。

B)如果构建了复合索引{name:1,data.country:1},则查询应该很快。但是您将所有数据存储在一个数组中,必须使用$ unwind op。因此,查询可能会很慢。

C)会更好。如果您存储如下数据:

{country : "A", province: "B", year : 1990, value: 200, name:"my-dataset"}
{country : "B", province: "B", year : 1990, value: 200, name:"my-dataset"}
...

使用复合索引{name:1,country:1},查询时间应为<为10ms。

D) MySQL vs MongoDB 1000 reads

答案 1 :(得分:1)

1.您可以使用MongoDB聚合:

db.collection.aggregate([
  {$match: {name: "my-dataset"}},
  {$unwind: "$data"},
  {$match: {"data.country": "A"}}
])

将为国家/地区为“A”的每个数据条目返回一份文档。如果要重新组合数据集,请添加$ group阶段:

db.collection.aggregate([
  {$match: {name: "my-dataset"}},
  {$unwind: "$data"},
  {$match: {"data.country": "A"}},
  {$group: {_id: "$_id", data: {$addToSet: "$data"}}}
])

(没有在适当的数据集上测试它,因此它可能会被窃听)

2.150000 mongodb的子文档仍然不多,所以如果你只查询一个数据集,它应该非常快(毫秒级)。

3.只要你确定你的文件小于16MB(有点难以说),最大的BSON文件大小),它应该没问题,但如果你存储了你的查询会更简单数据作为具有数据集名称作为属性的文档,通常更适合于表现。