【问题标题】:Embed document without knowing _id in Mongoose/Mongodb在不知道 _id 的情况下在 Mongoose/Mongodb 中嵌入文档
【发布时间】:2016-02-23 10:19:30
【问题描述】:

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

我对如何最好地解决这个问题有点迷茫。很多帖子都建议通过 Schema 进行链接,但我只看到Schema.Types.ObjectId。这对我来说似乎不切实际,因为我正在导入的数据只有自定义标识符。

我是否可以在MyCollection 中添加另一个字段,并在我上传数据时找到要链接到的正确位置的_id。如果是这样,有人可以指出我完成此任务的正确方向吗?

也许可以以某种方式使用 Map reduce?我对 Mongo 还是有点陌生​​。

试过

我确实尝试将整个位置数据加载到一个 JS 对象中,然后根据我的其他查询的返回对象检查该对象,将匹配的位置数据注入我的返回对象。这行得通,但速度难以忍受慢。

【问题讨论】:

  • Mongoose 无论如何都会在内部执行两个单独的查询,所以我会说走那条路。

标签: node.js mongodb mongoose


【解决方案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. [...]" 

Source

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

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

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

但也许您的主要问题是您无法在可靠的时间找到您正在寻找的Locations

我不知道您为 MyCollection 查找 Locations 的标准是。如果是坐标接近度,那么您可以通过过滤掉您真正不需要检查的位置来减少要检查的位置数量。那么您不必检查所有 40.000 个位置,但可能只检查 100 个?在下文中,我假设它是接近度。

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

类似这样的:

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

希望对你有帮助。

【讨论】:

  • 不应该在假期前发布这个,哈哈。因此,我对此的想法是首先查找位置,然后将这些location_ids 放入一个数组中,并在我的其他集合的后续$in 查询中使用它,确保我只得到我自己的寻找。之后我仍然必须合并这两个对象,但这应该更快。我现在会尝试并尽快回复您。
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多