Rudie
Rudie

Reputation: 53881

mongo add field to document ($set doesn't)

What I want:

What I do:

// 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)));

Why doesn't that do anything? The existing field isn't changed and the new field isn't added. Is the condition maybe wrong??

PS. The full code (with a lot of junk in between): http://pastebin.com/CNfCVxex
lines 33 - 37 -- fresh data
lines 63 - 76 -- query, fetch & update
lines 79 - 80 -- verify

Upvotes: 0

Views: 3312

Answers (2)

Ian Mercer
Ian Mercer

Reputation: 39277

I suspect you need to convert the string $doc['_id'] back to a MongoId by using new MongoId. See the example at the bottom of this page: http://www.php.net/manual/en/class.mongoid.php

Upvotes: 0

Joe
Joe

Reputation: 386

Not familiar with the driver you are using here, but from your description you can achieve what you want in a single database hit, no need to fetch/loop/update..

The $set operator will insert or update a field depending on whether it exists or not.

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

The above would set the 'myfield' field in all documents in the collection to 'x', or if it already exists it would change the value to 'x'. Is that what you want to achieve?

Upvotes: 2

Related Questions