2016-04-29 3 views
0

У меня есть простой документ:Mongo DB оператор обновления

/* 1 */ 
{ 
    "_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
    "Settings" : [ 
     [ 
      "Storage", 
      "Dedicated" 
     ], 
     [ 
      "Country", 
      "EE" 
     ], 
     [ 
      "Address", 
      "http://localhost:55557" 
     ], 
     [ 
      "Number", 
      "05" 
     ] 
    ] 
} 

не может понять, как написать заявление обновления для обновления информации об адресе "http://localhost:55557" для IP address.something как http://10.10.20.2:66667

+2

Такая схема чрезвычайно сложно запросить и обновить в MongoDB. Рассмотрите возможность изменения схемы таким образом, чтобы встроенные массивы были сплющены в документ с соответствующими парами полей/значений. – chridam

+0

chridam- I can not update schema, если бы я мог исправить ее соответствующими парами полей/значений. Я знаю, что это нехорошо. – vencrena

ответ

3

Конструкция схемы неверна , так как нет ключа для значения, которое вы хотите обновить. Рассмотрите возможность изменения вашей схемы следующим образом:

{ 
_id : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
settings : 
    { 
     storage:"Dedicated", 
     country:"EE", 
     address:"http://localhost:55557", 
     number:"05" 
    } 
} 

В приведенной выше схеме есть ключ для каждого значения в настройках, а не двойной массив. Любое значение доступно и доступно для редактирования в вышеупомянутом документе.

Вы можете обновить документ следующим образом

db.settings.update({ 
    _id: "9cbfceec-d6f6-5638-b7c9-49103dc39665" 
}, { 
    $set: { 
    "settings.address": "http://10.10.20.2:66667" 
    } 
}); 
+0

Ваше предлагаемое решение должно работать, если схема была хорошей. но это не решает мою проблему с двойным массивом. Я не могу изменить схему. – vencrena

+1

нет доступа к адресу напрямую, поскольку адрес не является ключом. Адрес - это первый элемент в массиве, а связанное с ним значение - это второе значение. Таким образом, единственный способ найти документ, получить массив настроек и найти адрес, выполнив сравнение строк, итерации по массиву. Затем вы обновите значение в документе, а затем обновите весь документ в коллекции. –

+0

Да, я уже использовал ту модель, которую вы предложили. Я думал, что ее можно сделать легче. Спасибо за вашу помощь. – vencrena

0

chirdam правильно о схеме.

Если вы не имеете положение, чтобы сделать новую схему, которую вы можете попробовать следующее:

Попробуйте этот запрос:

db.yourCollection.update({"_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", "Settings.Address" : "http://localhost:55557"} , { $set : {"Settings.$.Address" : "http://10.10.20.2:66667"}}); 

Или альтернатива использовать RoboMongo вручную редактировать вашу коллекцию

+0

Я знаю о схеме. Ваше решение также не помогает в моем случае, потому что это двойной массив. – vencrena