MongoDB, как обновить только часть массива? - PullRequest
1 голос
/ 17 сентября 2011

У меня есть документ в MongoDB, который содержит некоторую метаинформацию, такую ​​как дата обновления и _id, и массив адресов.

{
    "_id": {
        "$oid": "4e73a30466ca1a1f56000001"
    },
    "updated": 1316215062,
    "address": [
        {
            "street": "Rotenturmstrasse 8",
            "postcode": "1020",
            "phone": "Vienna",
            "altitude": -1,
            "geolocation": [
                "11.367464",
                "47.204876"
            ]
        }
    ]
}

Теперь может быть несколько адресов. Я создаю объект для адреса, который необходимо обновить, и сохраняю его в базе данных. Вот как выглядит новый объект для вставки:

new_object = {
    :_id=>BSON::ObjectId('4e73a30466ca1a1f56000001'), 
    :updated=>1316215099, 
    :address=>[
        nil, 
        nil, 
        {
            :street=>"Reumannplatz 8", 
            :postcode=>"1020", 
            :phone=>"Vienna", 
            :altitude=>-1, 
            :geolocation=>[
                "12.367464", 
                "48.204876"
            ]
        }
    ]
}

После вызова db.venues.save(new_object) я бы хотел, чтобы документ выглядел так:

{
    :_id=>BSON::ObjectId('4e73a30466ca1a1f56000001'), 
    :updated=>1316215099, 
    :address=>[         {
            "street": "Rotenturmstrasse 8",
            "postcode": "1020",
            "phone": "Vienna",
            "altitude": -1,
            "geolocation": [
                "11.367464",
                "47.204876"
            ]
        },

        nil,

        {
            :street=>"Reumannplatz 8", 
            :postcode=>"1020", 
            :phone=>"Vienna", 
            :altitude=>-1, 
            :geolocation=>[
                "12.367464", 
                "48.204876"
            ]
        }
    ]
}

Вместо этого он перезаписывает весь массив и в итоге выглядит так:

{
    :_id=>BSON::ObjectId('4e73a30466ca1a1f56000001'), 
    :updated=>1316215099, 
    :address=>[
        nil, 
        nil, 
        {
            :street=>"Reumannplatz 8", 
            :postcode=>"1020", 
            :phone=>"Vienna", 
            :altitude=>-1, 
            :geolocation=>[
                "12.367464", 
                "48.204876"
            ]
        }
    ]
}

Какой способ это сделать? Я пытаюсь избежать нескольких запросов. Было бы проще, если бы вместо этого массив адресов в базе данных был хешем?

Ответы [ 2 ]

1 голос
/ 04 января 2013

Я думаю, что вам нужно в этом случае $ push , что добавит новый адрес объекта в список.

Обновить одну запись в массиве немного сложно, но в зависимости от случая, $ addToSet может обработать это.

1 голос
/ 17 сентября 2011

Чтобы изменить данные, используйте модификаторы mongodb .

В этом случае вы хотите $ push новое значение в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...