![](/img/trans.png)
[英]Replace a JSON document with another in MongoDB & Mongoose without knowing the properties of the JSON document beforehand
[英]Embed document without knowing _id in Mongoose/Mongodb
我知道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对象中,然后根据我的其他查询中的返回对象检查该对象,将匹配的位置数据注入到我的返回对象中。 这种方法有效但速度难以忍受 。
首先,仅为记录: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 。 据我所知,你现在必须编写自己的链接方法。 如果要通过MyCollection by访问,则必须将location_id存储在MyCollection中并加载位置
Locations.find({location_id: <the_location_id>})
但也许您的主要问题是您无法在可靠的时间找到您正在寻找的位置 ?
我不知道你找到MyCollection的 地点的标准是。 如果它是坐标附近,那么您可以通过过滤掉您真正不需要检查的位置来减少要检查的位置数量。 那么你不必检查所有40.000个位置,但可能只有100个? 在下面我假设它是接近。
你有两个集合中的lat,lon ( Locations , MyCollection )吗? 如果是这样,您可以定义一个查询,该查询获取MyCollection对象周围的位置(正方形)。 然后,您将从MongoDb收到少量的地点 。 现在,您可以应用更复杂的检查,检查它们是否真正属于您的MyCollection -object 。
这样的事情:
Locations.find({lat: {$gt: <x>-a, $lt: <x>+a}, lon: {$gt: <y>-b, $lt: <y>+b}}, function(locations){ ... });
我希望它有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.