2012-02-08 2 views
9

Есть ли простой способ заменить весь встроенный документ в массив? Скажем замена:Замена встроенного документа в массив в MongoDB

{ 
    "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
} 

с:

{ 
    "_id" : "2", 
     "name" : "name6", 
     "xyz..." : "xyz5..." 
     "morefields..." : "fields..." 
} 

Поиск _id (встроенный). Или мне нужно заменить каждое поле индивидуально, используя $ set?

{ 
    "_id" : "2", 
    "users" : [{ 
     "_id" : "1", 
     "name" : "name1", 
     "xyz..." : "xyz1..." 
    }, { 
     "_id" : "2", 
     "name" : "name2", 
     "xyz..." : "xyz2..." 
    }], 
    "name" : "main name" 
} 

ответ

18

Вы используете шаблон "массив объектов". Вы можете использовать positional operator, он должен выглядеть примерно так:

coll.update({'_id':'2', 'users._id':'2'}, {$set:{'users.$':{ "_id":2,"name":"name6",... }}}, false, true) 

В моем опыте «массив объектов» шаблон не является оптимальным, если объекты имеют естественный идентификатор. В вашем случае это может быть смоделирована как следующие:

{ 
    "_id" : "2", 
    "users" : 
    { "1" : { "name" : "name1", "xyz..." : "xyz1..." }, 
     "2" : { "name" : "name2", "xyz..." : "xyz2..." } 
    } 
    "name" : "main name" 
} 

В этом случае вы можете использовать dot notation легко обновить элемент, который вы хотите.

var newValue = { "name" : "name6", "xyz..." : "xyz5...", "morefields..." : "fields..." }; 
coll.update({_id: 2}, { $set: { "users.2" : newValue } }); 
+0

Это отлично работает, спасибо! Интересная вторая альтернатива, но я не уверен, что она сработает, так как мне нужно будет удалить некоторые записи посередине. «users.2» - это позиция в массиве, который я предполагаю. –

+0

Я думал, что пользователи2 ссылаются на позицию массива, но на самом деле используют id (и возвращают пустые скобки для всех других элементов массива), cool. –

+0

MongoDB распознает массивы в запросе. Таким образом, «users.2» может искать в ' user' array ищет объекты с 'ключ' из' 2' * или * он может посмотреть на 'key: 2'' users'. –

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