2015-01-31 4 views
1

моя коллекция gamefamilies выглядит как этотMongoDB обновление неправильно поддокумент в массиве

{ 
    "_id": ObjectId('54cc3ee7894ae60c1c9d6c74'), 
    "game_ref_id": "REF123", 
    .. 
    "yearwise_details": [ 
    { 
     "year": 1, 
     ... 
     "other_details": [ 
      { 
       "type": "cash", 
       "openingstock": 988 
       .. 
      }, 
      { 
       "type": "FLU", 
       "openingstock": 555 
       .. 
      }, 
      ..other items 
     ] 
    }, 
    { 
     "year": 2, 
     ... 

     "other_details": [ 
      { 
       "type": "cash", 
       "openingstock": 3000, 
       .... 
      }, 
      ... 
      { 
       "type": "ghee", 
       "openingstock": 3000, 
       ... 
      }, 
      .. 
     ] 
    } 
] 
} 

Мой запрос на обновление

db.gamefamilies.update ({ "game_ref_id": "REF123", "teamname" : "manisha", "yearwise_details.year": 2, "yearwise_details.other_details.type": "ghee"}, {"$ set": {"yearwise_details.0.other_details. $. openstock": 555}});

Документ подбирается правильно. Я ожидаю обновить тип 2-го года = «ghee», но вместо этого обновляется второй элемент 1-го года (тип FLU). Что я делаю не так ?

Любая помощь была бы принята с благодарностью.

рассматривает Маниша

+0

попытаться сделать {yearwise_details.1.other_details. $. Openstock ": 555} –

ответ

1

К сожалению, пока не поддерживает вложенные $ positional operator обновлений.

Таким образом, вы можете жёстко обновление с

db.gamefamilies.update({"game_ref_id": "REF123", 
         "teamname": "manisha", 
         "yearwise_details.year": 2, 
         "yearwise_details.other_details.type": "ghee"}, 
         {"$set": 
         {"yearwise_details.1.other_details.$.openingstock": 555}}); 

Но обратите внимание, что yearwise_details.1.other_details является жестко прописывать, что вы хотите, второе значение массива (это 0-индексируются, поэтому 1 ссылается второй элемент). Я предполагаю, что вы нашли команду, которую у вас есть в своем вопросе, потому что она работала для первого элемента массива. Но он будет работать только на первом элементе, и команда выше будет работать только на втором элементе.

+0

Спасибо за ответ. Как я могу получить индекс yearwise_details? Также я считаю, что если я делаю 'yearwise_details' как объект (вместо массив), то это также могло бы решить мою проблему. Если я сделаю это объектом, могу ли я легко добавить новые «yearwise_details» - то есть новый документ в следующем году? – user2869612

+0

Единственный способ получить индекс 'yearwise_details', который вы ищете , вам нужно будет использовать '$' способ, которым вы его используете для массива деталей 'other_details'. Можно ли изменить массив' other_details' как массив объектов с полем 'type' значение' cash' или 'ghee', чтобы быть объектом с' cash' как поле для остальной части объекта 'cash', а' ghee' - поле для остальной части объекта 'field' вместо указания типа внутри subdo cument? В противном случае вы можете превратить 'yearwise_details' в объект из массива, но он теряет порядок. – NoOutlet

+0

И было бы немного сложнее. Вместо того, чтобы «нажимать» на объекты, вам нужно «установить» поле поддокумента со значением объекта, который вы бы нажали. – NoOutlet