Монго добавить поле в документ ($ set нет) - PullRequest
0 голосов
/ 23 ноября 2011

Что я хочу:

  • получить некоторые документы
  • для каждого документа, установите поле:
    • изменить его, если он существует
    • добавьте его, если нет

Что я делаю:

// fresh data
print_r(iterator_to_array($collection->find()->limit(2)));

// query
$docs = $collection->find()->limit(2);
// fetch
foreach ( $docs AS $id => $doc ) {
  // update
  $collection->update(array('_id' => $doc['_id']), array(
    '$set' => array(
      'existing_field' => 'x',
      'new_field' => 'y',
    ),
  ), array('multiple' => false));
}

// verify
print_r(iterator_to_array($collection->find()->limit(2)));

Почему это ничего не делает? Существующее поле не изменяется, а новое поле не добавляется. Состояние может быть неправильным?

PS. Полный код (с большим количеством мусора между): http://pastebin.com/CNfCVxex
строки 33 - 37 - свежие данные
строки 63 - 76 - запрос, выборка и обновление
строки 79 - 80 - проверить

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

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

Оператор $ set будет вставлять или обновлять поле в зависимости от того, существует оно или нет.

db.Collection.update({}, { $set : { "myfield" : "x" } }, false, true)

Выше было бы установить поле «myfield» во всех документах в коллекции на «x», или, если оно уже существует, оно изменит значение на «x». Это то, чего вы хотите достичь?

0 голосов
/ 23 ноября 2011

Я подозреваю, что вам нужно преобразовать строку $doc['_id'] обратно в MongoId с помощью new MongoId.Смотрите пример внизу этой страницы: http://www.php.net/manual/en/class.mongoid.php

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