我的位置集合具有自定义(读取:不在我的控制下)位置标识符及其对应的纬度/经度坐标.
var Locations = new Schema({ location_id: String, loc: { //lng, lat: as per mongodb documents type: [Number], index: '2d' } });
有几个集合具有引用此自定义标识符的字段以匹配纬度和经度.
var MyCollection = new Schema({ location: String, otherFields: Strings... });
我对如何最好地解决这个问题感到有些迷茫.很多帖子建议通过Schema链接,但我只看到了Schema.Types.ObjectId.这对我来说似乎不切实际,因为我导入的数据只有自定义标识符.
我是否可以在MyCollection中添加另一个字段,并在上传数据时找到要链接到的位置的正确_id.如果是这样,有人可以指出我正确的方向来实现这一目标.
可能会以某种方式使用Map reduce吗?我对Mongo还是有点新手.
试着
我确实尝试将整个位置数据加载到JS对象中,然后根据我的其他查询中的返回对象检查该对象,将匹配的位置数据注入到我的返回对象中.这种方法有效但速度难以忍受.
首先,仅为记录:MongoDb仍将为您存储的每个对象生成_id属性.1. "[...], if the mongod receives a document to insert that does not contain an _id field, mongod will add the _id field that holds an ObjectId. [...]"
Source
您写道,location_id不在您的控制之下.并且您想使用location_id,因为其他集合也在使用它?因此,您不希望破坏项目中的标准,这是好的.
正如我所看到的,你已经在MyCollection中拥有了location属性,并且可以在那里存储location_id.
据我所知,你现在必须编写自己的链接方法.如果要通过MyCollection by访问,则必须将location_id存储在MyCollection中并加载位置
Locations.find({location_id: <the_location_id>})
但也许您的主要问题是您无法在可靠的时间找到您正在寻找的位置?
我不知道你找到MyCollection的地点的标准是.如果它是坐标附近,那么您可以通过过滤掉您真正不需要检查的位置来减少要检查的位置数量.那么你不必检查所有40.000个位置,但可能只有100个?在下面我假设它是接近.
你有两个集合中的lat,lon(Locations,MyCollection)吗?
如果是这样,您可以定义一个查询,该查询获取MyCollection对象周围的位置(正方形).然后,您将从MongoDb收到少量的地点.现在,您可以应用更复杂的检查,检查它们是否真正属于您的MyCollection对象.
这样的事情:
Locations.find({lat: {$gt: <x>-a, $lt: <x>+a}, lon: {$gt: <y>-b, $lt: <y>+b}}, function(locations){ ... });
我希望它有所帮助.