2017-03-01 1 views
1

I R mongolite bin mit in einer Mongo Sammlung mit folgenden Struktur lesen und schreiben:Wie aktualisiert man ein Array von Filialdokumenten mit 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} 
]}] 

für ein bestimmtes Dokument aus meiner Sammlung, mag ich jeden Standort einige Attribute hinzuzufügen. Zum Beispiel würde Ich mag das erste Dokument wie folgt aktualisieren:

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

In mongolite, ich bin in der Lage, die Websites als Datenrahmen und berechnen die gewünschten Eigenschaften zu erhalten:

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 

Aber ich kann nicht finde einen Weg, um meine Datenbank zu aktualisieren. Ich habe versucht:

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

, die wenig überraschend gibt mir:

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

Gibt es eine Möglichkeit, die Websites Feld zu aktualisieren, indem Sie die neuen Attribute zu vorhandenen Elementen der arry Hinzufügen oder soll ich ersetzen die ganzen Websites Feld mit einer $set? Danke für Ihre Hilfe.

Ich denke, dass mein Problem zu this question verbunden ist, so könnte ich über jedes Element meiner Array-Schleife haben ...

Antwort

1

Die folgende scheint den Trick zu tun:

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"],'}}')) 
} 

noch interessiert, wenn Es gibt einen besseren Weg ...

Verwandte Themen