/** * Update a document * * Arguments can take the following forms: * * $criteria, $update, $options * $criteria, $operation, $keysValues, $options * $criteria, $operation, $key, $value, $options * * And these less-preferred forms: * $criteria, $update, NULL, $options * $criteria, $update, NULL, NULL, $options * $criteria, $operation, $keysValues, NULL, $options * * @param array|Cm_Mongo_Model_Abstract|mixed $criteria A model instance, query array or an _id * @param array|string $update An update array or an update operation name * @param array|string|null $key Update options or a key to update * @param array|string|int|float|MongoDate|null $value Update options or the update value * @param array $options * @return boolean */ public function update($criteria, $update, $key = NULL, $value = NULL, $options = array()) { // Compress number of arguments required if (is_array($update) && is_array($key)) { $options = $key; } else { if ((is_array($update) || is_array($key)) && is_array($value)) { $options = $value; } } // Prepare criteria if ($criteria instanceof Cm_Mongo_Model_Abstract) { $idQuery = array($criteria->getIdFieldName() => $criteria->getId()); // Allow updates with additional criteria if ($additionalCriteria = $criteria->getAdditionalSaveCriteria()) { $idQuery = array_merge($idQuery, $additionalCriteria); $criteria->setAdditionalSaveCriteria(); // Allow updates without _id field if additional criteria specified (upsert) if (!$idQuery[$criteria->getIdFieldName()]) { unset($idQuery[$criteria->getIdFieldName()]); } } if ($additionalOptions = $criteria->getAdditionalSaveOptions()) { $options = array_merge($options, $additionalOptions); } $criteria = $idQuery; } else { if (!is_array($criteria)) { $criteria = array('_id' => $this->castToMongo('_id', $criteria)); } } // Prepare update if (is_string($update)) { if (is_string($key)) { $update = array($update => array($key => $value)); } else { $update = array($update => $key); } } // Prepare options $options = array_merge(array('upsert' => FALSE, 'multiple' => FALSE, 'safe' => TRUE), $options); // Execute return $this->_getWriteCollection()->update_safe($criteria, $update, $options); }