2015-11-20 5 views
4

Я знаю, что в MongoDB нет «присоединяется». Я пытаюсь связать большое количество документов с 40 000 местами в моей коллекции мест.Вставить документ, не зная _id в Mongoose/Mongodb

В моей коллекции объектов есть пользовательские (считываемые: не под моим контролем) идентификаторы местоположений и их соответствующие координаты lat/lng.

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.Types.ObjectId. Это кажется мне непрактичным, поскольку данные, которые я импортирую, имеют только собственный идентификатор.

Могу ли я добавить еще одно поле в MyCollection и найти правильный адрес _id, куда вы хотите перевести данные. Если это так, может кто-то указать мне в правильном направлении для этого.

Сокращение карты может быть каким-то образом возможно? Я все еще немного начинаю с Монго.

Пробовал

Я попробовать загружая полноту данных о местоположении в объект JS затем проверить, что объект против возврата объекта из другого запроса, инъекционная данные сопоставления местоположения в мой обратном объект. Это работает, но невыносимо slow.

+0

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_ID там. Насколько я знаю, теперь вы должны написать свои собственные методы привязки. Вы должны хранить LOCATION_ID в MyCollection и загрузите место, если вы хотите получить доступ, если через MyCollection по

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

Но, может быть, ваша главная проблема в том, что вы не можете найти Места вы ищете в надежное время ?

Я не знаю ваши критерии для поиска Места для MyCollection есть. Если это близость координат, вы можете уменьшить количество мест для проверки, отфильтровывая те, которые вам действительно не нужно проверять.Тогда вам не нужно проверять все 40.000 мест, но, может быть, всего 100? В дальнейшем я предполагаю, что это близость.

У вас есть широта, долгота в обеих коллекциях (Locations, MyCollection)? Если это так, вы можете определить запрос, который получает местоположения вокруг вашего объекта MyCollection (квадрат). Затем вы получите меньшее количество Местоположение от MongoDb. Теперь вы можете применить свою более сложную проверку, которая проверяет, действительно ли они принадлежат вашему MyCollection -объекту.

что-то вроде этого:

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

Я надеюсь, что это помогает.

+0

Не стоит публиковать это прямо перед праздником. Итак, мои мысли об этом - сначала выполнить поиск для местоположений, затем поместите эти 'location_id' в массив и используйте его в следующем запросе '$ in' в моей другой коллекции, гарантируя, что я получаю только те, м ищет. Мне все равно придется объединить эти два объекта позже, но это должно быть быстрее. Я попробую сейчас и вернусь к вам как можно скорее. –

Смежные вопросы