2015-04-24 3 views
1

Вот моя схема (простая схема):Метеор - Обновление коллекции с объектом местоположения (в формате GeoJSON)

officelocation: { 
type: String, 
label: 'Location of Office', 
autoform: { 
    type: 'map', 
    afFieldInput: { 
    type: 'map', 
    geolocation: true, 
    searchBox: true, 
    autolocate: true 
    } 
} 
}, 
location: { 
    optional: true, 
    type: 'Point' 
} 

Мой стороне сервера код расслоение плотной ниже (обратите внимание на это в collection.after крючок), так Я хочу обновить его на основании адреса, который пользователь вошел, который я решил в Lat долго:

Providers.update({_id: doc._id}, {$set: {location: {type:"Point", coordinates:[lng,lat]} } }); 

Когда я вижу файл в коллекции (db.providers.find();), я вижу внизу .. Обратите внимание, что местонахождение внедренного объекта пуст:

{ "_id" : "X8ZfKYJAP9cduwvmd", "phone" : 999999999, "officelocation" : "40.7192714,14.872363899999982", "createdAt" : ISODate("2015-04-24T02:00:40.447Z"), "updatedAt" : ISODate("2015-04-24T02:00:40.799Z"), "owner" : "GB4TxTHodkykeeXp6", "officeaddress" : "Via Califri, 5, 84099 San Cipriano Picentino SA, Italy", "location" : { } } 

Я в основном пытаюсь убедиться, что коллекции хранятся в геопространственном поиске, но этот подход не работает. Любая помощь?

ответ

0

Возможно, возникло несколько факторов, из-за которых ваше обновление терпит неудачу, от правил запрета на простую схему, очищающих ваши данные.

Я вижу, что вы используете собственный тип для хранения вашего местоположения. Убедитесь, что вы использовали Transform, чтобы гарантировать, что тип не потерян на пути к серверу. От Simple Schema readme:

Пользовательские типы объектов по умолчанию считаются объектами черного ящика. Однако при использовании collection2 вы должны убедиться, что пользовательский тип не потерян между клиентом и сервером. Это можно сделать с помощью функции преобразования, которая преобразует общий объект в пользовательский объект. Без этого преобразования клиентские вставки и обновления могут быть успешными на клиенте, а затем сбой на сервере. В качестве альтернативы, если вы не хотите потерять настраиваемый тип, вы можете явно установить blackbox: true для пользовательского типа объекта вместо использования преобразования.

В качестве альтернативы можно использовать вложенную схему, чтобы определить, что такое расположение позволено выглядеть, вместо того чтобы использовать пользовательский тип, но он не будет держать методы Point типа.

+0

Я не совсем понимаю. 1) Это должно позаботиться о разрешении вставок: 'Providers.allow ({ insert: function (userId, doc) { return true;}});'. 2) Я нашел этот вопрос [link] (http://stackoverflow.com/questions/24492333/meteor-simple-schema-for-mongo-geo-location-data), который, я считаю, является тем, что вы предлагаете с помощью подсхемы , Но я изо всех сил пытаюсь выяснить, как обновить этот объект сейчас? В примере @ chaosbohne будет что-то вроде 'Providers.update ({_ id: doc._id}, {$ set: {loc: {type:" Point ", координата: {lng: 22.122, lat: -122.212}}}}), 'работа? –

+0

1) Да, и вы должны явно разрешать обновления, а также вставки, поэтому для вашего объекта-разрешения должен быть также объект 'update: function (userId, doc, fieldNames, modifier). {Return true;}' 2) Да, этот код обновления должен правильно обновить схему, описанную им 3) Обязательно обновите ее как «Providers.update (doc._id, {...})» от клиента. Клиентский код обычно не должен использовать объекты в качестве селекторов на стороне клиента. –

+0

У меня также был асетер. Но спасибо! Он работает чудесно. Ценю вашу помощь. –