2017-03-01 16 views
1

我,使用R mongolite讀取和一個蒙戈集合結構如下寫:如何用R mongolite更新子文檔數組?

[{_id: 1, name: a, sites: [ 
    {ref: site_a1}, 
    {ref: site_a2} 
]}, 
{_id: 2, name: b, sites: [ 
    {ref: site_b1}, 
    {ref: site_b2} 
]}, 
{_id: 3, name: c, sites: [ 
    {ref: site_c1}, 
    {ref: site_c2}, 
    {ref: site_c3}, 
    {ref: site_c4} 
]}] 

對於我收藏的一個給定的文檔,我想一些屬性添加到每個站點。例如,我想更新的頭文件是這樣的:

{_id: 1, name: a, sites: [ 
    {ref: site_a1, lat: 10, lng: 20}, 
    {ref: site_a2, lat: 5, lng: 40} 
]} 

在mongolite,我能夠得到網站的數據幀,並計算所需的屬性:

sites <- db$find(query = '{"name": 1}', 
     fields='{"_id": 0, "name": 0}')$sites[[1]] 
loc <- getLatLng(sites) 
# loc is a dataframe with lat and lng for each site 

但我不能找到一種方法來更新我的分貝。我曾嘗試:

db$update(query = '{"name": 1}', 
      update = paste0('{"$push":{"sites": {"$each":',jsonlite::toJSON(loc),'}}}'), 
      upsert = FALSE, multiple = FALSE) 

這並不奇怪給我:

{_id: 1, name: a, sites: [ 
    {ref: site_a1}, 
    {ref: site_a2}, 
    {lat: 10, lng: 20}, 
    {lat: 5, lng: 40} 
]} 

有沒有辦法通過增加新屬性到ARRY的現有元素來更新網站領域,或者我應該更換整個網站字段有$set?謝謝你的幫助。

我想,我的問題是與this question,所以我可能要遍歷我數組的每個元素...

回答

1

下,似乎這樣的伎倆:

sites <- db$find(query = '{"name": 1}', 
     fields='{"_id": 0, "name": 0}')$sites[[1]] 
loc <- getLatLng(sites) 

for (i in 1:nrow(sites)){ 
    db$update(query = paste0('{"name": 1, "sites.ref":', sites$ref[i],'}'), 
      update = paste0('{"$set":{"sites.$.lat":',loc[i, "lat"],'}, 
          "$set":{"sites.$.lon":',loc[i, "lng"],'}}')) 
} 

如果仍然對有更好的方法...