Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 提高此MongoDB查询的性能_Node.js_Mongodb_Mongodb Query - Fatal编程技术网

Node.js 提高此MongoDB查询的性能

Node.js 提高此MongoDB查询的性能,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我有一个MongoDB文档,其中包含一个相当大的嵌入式阵列: name : "my-dataset" data : [ {country : "A", province: "B", year : 1990, value: 200} ... 150 000 more ] 假设我想返回country==“A”的数据对象 正确的方法是什么,例如通过NodeJs 给定150 000个条目和200个匹配项,查询大约需要多长时间 将数据存储为文档,

我有一个MongoDB文档,其中包含一个相当大的嵌入式阵列:

name : "my-dataset"
data : [ 
          {country : "A", province: "B", year : 1990, value: 200}
          ... 150 000 more 
       ]
假设我想返回country==“A”的数据对象

  • 正确的方法是什么,例如通过NodeJs

  • 给定150 000个条目和200个匹配项,查询大约需要多长时间

  • 将数据存储为文档,并将名称存储为每个文档的属性(性能/结构方面)是否更好

  • 使用Mysql会更有效吗?)

  • 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)

    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文档的最大大小),就可以了,但如果您将数据存储为文档,并将数据集名称作为属性,查询会更简单,这通常对性能更有利。

    好的。现在呼吸一下,你到底在问什么问题?你是说一个“文档”有150000个嵌入式数组元素吗?可能不是一个好的设计。试着仔细解释你想做什么,让它听起来像一个问题。解决方案很可能使用不同的结构,但正确的答案将解决您需要做的事情,因为您正确地解释了它。顺便说一句,仅仅用粗体字并不能得到更好的答案。根据我的经验,在与mysql进行性能比较时,对于简单的查询(如“按此ID查找一条记录”),结果基本相同,而对于更复杂的sql查询(使用mongo的聚合框架),使用mysql的结果要好一些。对于一些相当大的数据量(0.5 Tb)。更重要的是,mysql需要3倍的磁盘空间来保存完全相同的数据,这可能间接地解释了它更快(磁盘读取更少)的原因。
    explain()
    是分析mongodb性能的最佳方法。在中查找更多详细信息