Node.js 提高此MongoDB查询的性能
我有一个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个匹配项,查询大约需要多长时间 将数据存储为文档,
name : "my-dataset"
data : [
{country : "A", province: "B", year : 1990, value: 200}
... 150 000 more
]
假设我想返回country==“A”的数据对象
{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性能的最佳方法。在中查找更多详细信息