2015-04-24 60 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' 
} 

我的服務器端的js代碼低於(注意,這是在collection.after掛鉤),所以我想在此基礎上我已經解決到Lat Long網用戶已經輸入的地址,來更新它:

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

可能有許多事情導致您的更新失敗,從允許拒絕規則到簡單模式清除您的數據。

我看到您正在使用自定義類型來存儲您的位置。確保你已經使用了轉換來確保類型在到服務器的途中不會丟失。來自Simple Schema readme

默認情況下,自定義對象類型被視爲黑盒對象。但是,在使用collection2時,您必須確保客戶端和服務器之間的自定義類型不會丟失。這可以通過將通用對象轉換爲自定義對象的轉換函數來完成。如果沒有這種轉換,客戶端插入和更新可能會在客戶端上成功,但在服務器上失敗。或者,如果您不關心丟失自定義類型,則可以顯式設置blackbox:對於自定義對象類型,請使用true,而不要使用轉換。

或者,您可以使用子模式來定義允許位置的外觀,而不是使用自定義類型,但它不會保留Point類型的方法。

+0

我不完全明白。 1)這應該注意允許插入:'Providers.allow({insert:function(userId,doc){true};}});'。 2)我發現這個問題[鏈接](http://stackoverflow.com/questions/24492333/meteor-simple-schema-for-mongo-geo-location-data),我相信是你正在建議與子模式。但是我正在努力弄清楚現在如何更新這個對象?在@ chaosbohne的例子中,像'Providers.update({_ id:doc._id},{$ set:{loc:{type:「Point」,coordinate:{lng:22.122,lat:-122.212}}}} );'工作? –

+0

1)是的,你必須明確地允許更新以及插入,所以'update:function(userId,doc,fieldNames,modifier)){return true;}'也需要在你的允許對象中 2 )是的,那個更新代碼應該正確地更新他所描述的模式 3)確保從客戶端更新它像'Providers.update(doc._id,{...})'。客戶端代碼通常不應該在客戶端使用對象作爲選擇器。 –

+0

我確實有更新allower也。但是,謝謝!它奇妙地工作。感謝你的幫助。 –