2017-02-11 4 views
1

Мне интересно, как я могу изменить элемент в таком массиве в Mongo DB. Скажем коллекции выглядит следующим образом:Mongo DB изменить элементы в вложенных массивах

{ 
"_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" 
      } 
     ] 
    } 
] 

Я пытаюсь изменить значение amount в "portfolio:market_symbol":"NASDAQ:GOOGL", где purchased_price является 900, и я хочу, чтобы установить 200 до 300.

так в сегмент должен выглядеть после модификации:

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

Я пытался использовать $elemMatch в Монго оболочки

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}}) 

Кажется, что запрос всегда возвращает весь раздел "portfolio:market_symbol":"NASDAQ:GOOGL", потому что 0 в {$set:{"portfolio.$.details.0.amount":300}} изменяет первый массив в details, чьи purchased_price является 810.25, а не то, что я ожидаю, что $elemMatch дать мне (3-й элемент из массива, purchased_price - 900).

Есть ли способ, которым я могу изменить этот вложенный вложенный массив, вместо того, чтобы вытащить все это, изменить данные в моей программе, а затем записать всю вещь обратно?

Пожалуйста, помогите, спасибо.

ответ

1

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

Существует билет MongoDB JIRA: https://jira.mongodb.org/browse/SERVER-831

Но вы можете обновить конкретный документ вручную.

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 } }); 
}); 

Это работает для меня. Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^