За последние 24 часа нас посетили 15122 программиста и 1693 робота. Сейчас ищут 913 программистов ...

Сохранение и изменение документов в MongoDB с массивами

Тема в разделе "PHP и базы данных", создана пользователем TCHProgrammer, 8 апр 2015.

  1. TCHProgrammer

    TCHProgrammer Активный пользователь

    С нами с:
    8 апр 2015
    Сообщения:
    10
    Симпатии:
    1
    Здравствуйте! Проблема заключается в следующем. У меня в MongoDB есть коллекция userContacts, состоящая из 2-х полей: rel_id(int) и contacts(массив из целых чисел). При вставке (insert) изменении (update) средствами php MongoClient rel_id в новую запись записывается нормально, а в массив contacts приходит только первое значение. Например, записать нужно [0,13], а записывается только [0].
    Вот коды, где всё это используется:
    Код (PHP):
    1. public function addUserToContacts($id, $newUserId){
    2.             
    3.             $connecting_string =  sprintf('mongodb://%s:%d/%s', 'localhost', 27017, 'sensorra');
    4.  
    5.             $mongo = new MongoClient($connecting_string);
    6.             $mongoDB = $mongo->sensorra;
    7.  
    8.             $collection = $mongoDB->userContacts;
    9.  
    10.             $userContacts = $collection->find(['rel_id'=>(int)$id]);
    11.  
    12.             $foundUserContact = null;
    13.  
    14.             foreach($userContacts as $item){
    15.                 $foundUserContact = $item;
    16.                 break;
    17.             }
    18.  
    19.             if($foundUserContact){
    20.                 $contacts = $foundUserContact['contacts'];
    21.                 foreach($contacts as $item){
    22.                     if($item == $newUserId){
    23.                         return;
    24.                     }
    25.                 }
    26.                 $contacts[] = (int)$newUserId;
    27.  
    28.                 $newdata = array('$set' => array("contacts" => $contacts));
    29.                 $collection->update(array("rel_id" => (int)$id), $newdata, ['fsync'=>true]);
    30.                 
    31.  
    32.             } else {
    33.                 $contacts = [];
    34.                 $contacts[] = (int)0;
    35.                 $contacts[] = (int)$newUserId;
    36.  
    37.  
    38.  
    39.                 //$collection->insert(['rel_id'=>(int)$id, 'contacts'=>$contacts], ['fsync'=>true, 'socketTimeoutMS'=>1000]);
    40.                 $collection->save(['rel_id'=>(int)$id, 'contacts'=>$contacts], ['w'=>true]);
    41.             }
    42.  
    43.       }
    И ещё один код:

    Код (PHP):
    1. public function removeUserFromContacts($id, $removedUserId){
    2.  
    3.               $connecting_string =  sprintf('mongodb://%s:%d/%s', 'localhost', 27017, 'sensorra');
    4.  
    5.             $mongo = new MongoClient($connecting_string);
    6.             $mongoDB = $mongo->sensorra;
    7.  
    8.             $collection = $mongoDB->userContacts;
    9.  
    10.             $userContacts = $collection->find(['rel_id'=>(int)$id]);
    11.  
    12.             $foundUserContact = null;
    13.  
    14.             foreach($userContacts as $item){
    15.                 $foundUserContact = $item;
    16.                 break;
    17.             }
    18.  
    19.             if($foundUserContact){
    20.                 $contacts = $foundUserContact['contacts'];
    21.                 $found = false;
    22.                   $foundIndex = null;
    23.                   foreach($contacts as $k=>$userId){
    24.                     if($userId == $removedUserId){
    25.                           $found = true;
    26.                           $foundIndex = $k;
    27.                     }
    28.                   }
    29.  
    30.                   if($found){
    31.                       array_splice($contacts,$foundIndex,1);
    32.                       if(count($contacts) == 0){
    33.                         $contacts[] = (int)0;
    34.                     }
    35.  
    36.                     $newdata = array('$set' => array("contacts" => $contacts));
    37.                     $collection->update(array("rel_id" => (int)$id), $newdata, ['fsync'=>true]);
    38.  
    39.  
    40.                   }
    41.             }    
    42.  
    43.       }
    Добавлено спустя 15 минут 33 секунды:
    Самое интересное, что я сходил на обед, пришёл и всё стало записываться как надо через 1.5 часа. Но потом всё началось по новой. И я выяснил, что на локалхосте есть како-то невидимый кеш для монги. Может на удалённом хосте такого не будет.