Замена встроенного документа в массиве в MongoDB - PullRequest
12 голосов
/ 08 февраля 2012

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

{
   "_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"
}

1 Ответ

20 голосов
/ 09 февраля 2012

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

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"
}

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

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