我知道MongoDB中没有“连接”。我正在尝试将大量文档链接到我的location集合中的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...
});
我对如何最好地解决这个问题感到有点迷茫。很多帖子建议通过Schema进行链接,但我只看到Schema.Types.ObjectId
。这对我来说似乎不切实际,因为我导入的数据只有自定义标识符。
我是否可以在MyCollection
中添加其他字段,并在上传数据时找到要链接到的位置的正确_id
。如果是这样,有人可以指出我正确的方向来实现这一目标。
可能会以某种方式使用Map reduce吗?我对Mongo还是有点新手。
尝试
我确实尝试将整个位置数据加载到JS对象中,然后根据我的其他查询中的返回对象检查该对象,将匹配的位置数据注入到我的返回对象中。这有效,但 难以承受 慢。
答案 0 :(得分:1)
首先,仅供记录: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来访问
Locations.find({location_id: <the_location_id>})
但也许您的主要问题是您无法在可靠的时间内找到您正在寻找的地点?
我不知道您为 MyCollection 找到地点的标准是。如果它是坐标附近,那么您可以通过过滤掉您真正不需要检查的位置来减少要检查的位置数量。那么你不必检查所有40.000个位置,但可能只有100个?在下面我假设它是接近。
您是否在两个集合中都有 lat,lon (地点, MyCollection )? 如果是这样,您可以定义一个查询,该查询获取 MyCollection 对象(正方形)周围的位置。然后,您将从MongoDb收到少量位置。现在,您可以应用更复杂的检查,检查它们是否真正属于 MyCollection - 对象。
类似的东西:
Locations.find({lat: {$gt: <x>-a, $lt: <x>+a}, lon: {$gt: <y>-b, $lt: <y>+b}}, function(locations){ ... });
我希望它有所帮助。