在不知道_id的情况下embedded文件在Mongoose / Mongodb中

我知道MongoDB中没有“连接”。 我试图将大量文​​档链接到我的位置集合中的40,000多个位置。

我的位置集合具有自定义(读取:不在我的控制之下)位置及其对应的纬度/经度坐标的标识符。

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... }); 

我有点迷失在如何最好的去做这件事。 很多post都build议通过Schema进行链接,但是我只能看到Schema.Types.ObjectId 。 这对我来说似乎不切实际,因为我要导入的数据只有自定义标识符。

我可以添加另一个字段到MyCollection并find正确的_id链接到我正在上传数据的位置。 如果是这样,有人可以指出我正确的方向来完成这一点。

地图缩小也许可以用某种方式? 我对Mongo还是一个新手。

试着

我尝试加载完整的位置数据到一个JS对象,然后检查该对象从我的另一个查询返回对象,注入匹配的位置数据到我的返回对象。 这有效,但是速度难以忍受

首先,为了logging: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. [...]" 

资源

你写的location_id不受你控制。 你想使用location_id,因为其他集合也使用它? 所以你不想在你的项目中打破这个标准。

正如我所看到的,您已经在MyCollection中拥有location属性,并且可以在其中存储location_id 。 据我所知,你现在必须编写你自己的链接方法。 您必须将location_id存储在MyCollection中,并且如果您想通过MyCollection by来访问,请加载Location

 Locations.find({location_id: <the_location_id>}) 

但是,也许你的主要问题是,你不能在可靠的时间find你正在寻找的位置

我不知道你的标准是为MyCollectionfind位置 。 如果它是坐标的接近,那么你可以通过过滤掉你不需要检查的位置来减less检查位置的数量。 那么你不必检查所有的40.000地点,但也许只是100? 在下面,我认为这是接近。

在两个集合( LocationsMyCollection )中都有lat,lon吗? 如果是这样,你可以定义一个查询,获取MyCollection对象(方形)周围的位置。 然后,您将从MongoDb获得更less的位置 。 现在您可以应用更复杂的检查,检查它们是否属于您的MyCollection对象

像这样的东西:

 Locations.find({lat: {$gt: <x>-a, $lt: <x>+a}, lon: {$gt: <y>-b, $lt: <y>+b}}, function(locations){ ... }); 

我希望它有帮助。