gpt4 book ai didi

node.js - geoNear 的 MongoDB 性能问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:24:49 26 4
gpt4 key购买 nike

嘿,我有一个 MongoDB 数据库,并且正在使用 Node.js 和 Mongoose。

我有一个 Mongoose 架构如下所示的集合:

{
location2d: {
type: [Number], //[<longitude>, <latitude>]
index: '2dsphere'
},
name: String,
owner: {type: Schema.Types.ObjectId, ref: 'Player', index: true},
}

这个集合相当大(500,000 个文档)。当我执行简单的最近查找查询时,它运行得相当快,大约 10 毫秒。

但是当我做这样的事情时:

this.find({owner: {$ne:null}})
.where('location2d')
.near({center: [center.lon, center.lat], maxDistance: range / 6380000, spherical: true})
.limit(10)
.select('owner location2d')
.exec()

需要很长的时间,大约60秒!仅仅因为我在 find 方法中添加了 {owner: {$ne:null}} ,执行所需的次数就乘以了 6000 次。

我做错了什么?我该如何改进?

当我按所有者进行搜索时,速度很快,当我按邻近度进行搜索时,速度很快,但当我将两者结合起来时,速度慢得令人难以置信。

有什么线索吗?

最佳答案

好的,我找到了一个解决方案,有点脏,但速度很快。

第一个:创建一个名为 ownerIdAsInt 的新字段,它是所有者 mongo Id 解析后的 int:document.ownerIdAsInt = parseInt(document.owner.toString(), 16)。如果 owner 为 null,则将该字段设置为 0

第二:使用 {ownerIdAsInt: 1, location2d: "2dsphere"}

定义复合索引

你的架构应该像这样:

var schema = new Schema({
location2d: {
type: [Number], //[<longitude>, <latitude>]
index: '2dsphere'
},
name: String,
owner: {type: Schema.Types.ObjectId, ref: 'Player', index: true},
ownerIdAsInt: Number
});
schema.index({ownerIdAsInt: 1, location2d: "2dsphere"});

现在的查询是:

this.find({ownerIdAsInt: {$gt: 0},
location2d: {$nearSphere: [center.lon, center.lat],
$maxDistance: range / 6380000}})
.limit(10)
.select('owner location2d')
.exec()

结果现在约为 20 毫秒长。更快!

关于node.js - geoNear 的 MongoDB 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31103870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com