Exemple #1
0
 /**
  * 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);
 }