2017-01-08 3 views
1

Эй, я пытаюсь обновить вложенный объект в моем MongoDB.MongoDB обновляет вложенный элемент динамическим идентификатором

Они структура

[ 
{ 
    "_id": "5871010d1ff9831574e7178d", 
    "created_at": "2017-01-07T14:54:05.791Z", 
    "updated_at": "2017-01-07T14:54:05.791Z", 
    "place_id": "ChIJ1eTO6eS1vkcRL_mX2RWUKo4", 
    "name": "Kunstwerk Restaurant Gummersbach", 
    "__v": 0, 
    "cooks": [], 
    "menus": [ 
    { 
    "58727068ba8d6c04a0ea331f": [ 
     { 
     "intolerances": { 
      "intolerance" : "false" 
      ... 
      }, 
     "nutritiondata" : [ 
      {...} 
     ], 
     "cookname": "[email protected]", 
     "menuname": "MenünameX" 
     } 
    ] 
    } 
] 

вложенной ID в меню еще один идентификатор документа MongoDB, который создается динамически.

Я пытаюсь обновить menuname, но не могу получить доступ к нему, так как mongo всегда возвращает null или не находит элемент, поскольку ему нужно искать только ключ, а не пару ключевых значений.

Что я тестировал до сих пор:

db.restaurants.update({ 'menus.58727068ba8d6c04a0ea331f', { $set : {"menus.$.menuname" : "test"}}}); 

db.restaurants.findOne({ 'menus.58727068ba8d6c04a0ea331f' : "58727068ba8d6c04a0ea331f"}); 

db.restaurants.find({ menus : { $elemMatch : {"58727068ba8d6c04a0ea331f": "58727068ba8d6c04a0ea331f" }}}); 

db.restaurants.findOne({ menus : { $eq : "58727068ba8d6c04a0ea331f" }}); 

ответ

1

Так что благодаря suzo я выяснил решение. MongoShell код, который работает:

db.restaurants.update({"_id" : ObjectId("5871010d1ff9831574e7178d")}, {$set: {"menus.58727068ba8d6c04a0ea331f.0.menuname" : "testName"}}); 

UPDATE: Поскольку мое поле Смешанный тип, это не обновляется, не получая отмечен !. Итак, вот полный правильный код:

Restaurant.findOne({ _id : req.body.r_id }, function(error, restaurant){ 
    if(error) console.log(error); 

    for(var i = 0; i < restaurant.menus.length; i++){ 
      restaurant.markModified('menus'); 
     if(restaurant.menus[i][req.params.id] != undefined){ 
      restaurant.menus[i][req.params.id].menuname = req.body.name; 
     } 

     if(i == restaurant.menus.length-1){ 
      restaurant.save(); 
      res.json(jObj); 
     } 
    } 

    }) 
+0

Прохладный. Похоже, это то же самое, что и мой ответ, но, мой вопрос, что, если мы не знаем индекс массива? – superUser

+0

обновил мой ответ :) все время сталкивался с проблемой, так как я понял свой первый ответ. Поэтому мое решение - посмотреть, какой ключ не определен. Поскольку у меня есть только уникальные ключи, этот метод работает. –

1

Используйте $set метод, как показано ниже:

db.restaurants.update({"_id":"5871010d1ff9831574e7178d"}, {$set: {"menus.58727068ba8d6c04a0ea331f.0.menuname":"test"}); 

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

+0

спасибо за ответ, поэтому я мог бы использовать $ в качестве заполнителя для объекта? В качестве примера меню «ИД». $. Menuname? Также в вашем примере mongoshell только ответ с .... Так что это не сработало? –

+0

Он ожидает поле массива в запросе, вы получаете какую-либо ошибку? – superUser

+0

Нет просто 3 баллов. Ich думаю, что Auch ожидающий результата ... Но сообщение об ошибке не вызывает –

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