2017-02-11 5 views
1

Ich frage mich, wie kann ich das Element in einem solchen Array in Mongo DB ändern. Sprich die Sammlungen ist wie folgt:Mongo DB modifizieren Elemente in verschachtelten Arrays

{ 
"_id" : ObjectId("xxxxxxxxxxxxxxxx"), 

"user_info" : { 
    "user_name" : "joe",   
}, 

"portfolio" : [ 
    { 
     "market_symbol" : "NASDAQ:GOOGL", 
     "details" : [ 
      { 
       "amount" : 100, 
       "purchased_price" : 810.25, 
       "date_of_purchase" : "20170210 212426" 
      }, 
      { 
       "amount" : 100, 
       "purchased_price" : 810.25, 
       "date_of_purchase" : "20170210 212426" 
      }, 
      { 
       "amount" : 200, 
       "purchased_price" : 900.0, 
       "date_of_purchase" : "20170210 212426" 
      } 
     ] 
    }, 
    { 
     "market_symbol" : "NYSE:BABA", 
     "details" : [ 
      { 
       "amount" : 200, 
       "purchased_price" : 80.0, 
       "date_of_purchase" : "20170210 212426" 
      }, 
      { 
       "amount" : 333, 
       "purchased_price" : 86.11, 
       "date_of_purchase" : "20170210 212426" 
      } 
     ] 
    } 
] 

Ich versuche, den Wert von amount in "portfolio:market_symbol":"NASDAQ:GOOGL" zu ändern, wo die purchased_price ist 900 und ich möchte die 200 bis 300

so das Segment setzen sollten sehen wie folgt nach der Änderung:

"portfolio" : [ 
{ 
    "market_symbol" : "NASDAQ:GOOGL", 
    "details" : [ 
     { 
      "amount" : 100, 
      "purchased_price" : 810.25, 
      "date_of_purchase" : "20170210 212426" 
     }, 
     { 
      "amount" : 100, 
      "purchased_price" : 810.25, 
      "date_of_purchase" : "20170210 212426" 
     }, 
     { 
      "amount" : 300, 
      "purchased_price" : 900.0, 
      "date_of_purchase" : "20170210 212426" 
     } 
    ] 
}, 

I $elemMatch in mongo zu verwenden versucht shell

db.Users.update({"user_info.user_name":"joe","portfolio":{$elemMatch:{"market_symbol":{$eq:"NASDAQ:GOOGL"},"details.purchased_price":{$eq:900}}}},{$set:{"portfolio.$.details.0.amount":300}}) 

Es scheint, dass die Abfrage immer den gesamten Abschnitt von "portfolio:market_symbol":"NASDAQ:GOOGL" zurückkehren, weil die 0 in {$set:{"portfolio.$.details.0.amount":300}} in details das erste Array modifiziert, deren purchased_price ist 810.25, und nicht als das, was ich die $elemMatch erwarten, dass ich geben (das dritte Element aus dem Array, dessen purchased_price ist 900).

Gibt es eine Möglichkeit, dass ich diese verschachtelte verschachtelte Array ändern kann, anstatt aus der ganzen Sache ziehen, um die Daten in meinem Programm ändern, dann die ganze Sache wieder schreiben?

Bitte helfen Sie, danke.

Antwort

1

Soweit ich weiß, unterstützt die Positions Bediener nur eine Ebene tief und nur die erste passende element.So die alle Dokumente in Array-Einrichtung Aktualisierung ist jetzt nicht möglich.

Es gibt ein MongoDB JIRA Ticket: https://jira.mongodb.org/browse/SERVER-831

Sie können aber manuell bestimmtes Dokument aktualisieren.

db.test.find( 
{ "user_info.user_name":"joe", "portfolio.details.purchased_price" : 900.0 }).forEach(function(doc) { 
    doc.portfolio.forEach(function(item) { 
     item.details.forEach(function (amt){ 
      if (amt.purchased_price == 900.0) 
       amt.amount=300 
      }); 
     }); 
    db.test.update({ "user_info.user_name":"joe", "portfolio.details.purchased_price" : 900.0 }, { "$set": { "portfolio": doc.portfolio } }); 
}); 

Es funktioniert für mich.Hoff das hilft.