За последние 24 часа нас посетили 17980 программистов и 1681 робот. Сейчас ищут 1136 программистов ...

Многоуровневая выборка с MongoDB Driver

Тема в разделе "PHP и базы данных", создана пользователем sphinks_a, 1 апр 2017.

  1. sphinks_a

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

    С нами с:
    17 авг 2011
    Сообщения:
    11
    Симпатии:
    0
    На днях познакомился с прекрассным инструментом MongoDb. Вроде бы и ничего, но (!)
    Сервер: Убунту 16,04, ПХП 7.015. На него ставил из MongoDb из Pecl и установилась версия 1.2.8
    И все вроде бы хорошо, но работает все как -то через Driver.
    Расскажу подробнее:
    1. Соединение с БД:
    Код (Text):
    1. $mongo = new MongoDB\Driver\Manager("mongodb://localhost:27017");
    И вот так во всем. Но, думаю, ничего страшного, напишу класс-обертку и погнали. Но тут начинаются трудности.
    2. Очень мало актуальной документации. Сколько не гуглю, все что-то не то. И плюс было расширение Монго, о котором в инете много инфы, но ПХП пишет, что это старое Г -авно и никому это не нужно.
    А теперь сама проблема. Имеется файл json
    Код (Text):
    1.  
    2. {
    3.   "Header": {
    4.     "ModuleId": 3,
    5.     "GeneratedTime": "2017-03-31T17:24:29.5822999Z",
    6.     "MsgGuid": "bfd5d9d6-a6fa-414f-903b-e09300d433a9",
    7.     "MsgId": 592
    8.   },
    9.   "Peer": {
    10.     "Id": 2274581,
    11.     "Events": {
    12.       "Event": {
    13.         "Id": 6,
    14.         "Name": "Birthday",
    15.         "Guests": [
    16.           {
    17.             "Name": "Ivan",
    18.             "SecondName": "Kolomiec",
    19.             "Phone": "+30xxxxx",
    20.             "Status": "Active"
    21.           },
    22.          {
    23.             "Name": "Petro",
    24.             "SecondName": "Volovec",
    25.             "Phone": "+30xxxxx",
    26.             "Status": "Active"
    27.           },
    28.          {
    29.             "Name": "Maxim",
    30.             "SecondName": "Kopernic",
    31.             "Phone": "+30xxxxx",
    32.             "Status": "Active"
    33.           }]
    34.         }
    35.     }
    36.   }
    37. }
    Я его засовываю в Монгу и он там себе лежит со своим ИД, который ему присвоила система.
    И вот я пытаюсь сделать выборку по Peer Id, к примеру, и не могу найти, как это сделать.
    Выборку делаю так:
    Код (Text):
    1.  
    2. public function select($filter,$options){
    3.     $mongo = $this->init();
    4.     $query = new MongoDB\Driver\Query($filter, $options);
    5.     try {
    6.         $cursor = $mongo->executeQuery($this->dbname, $query);
    7. //        Debug($cursor);
    8.         $cursor = MongoDB\BSON\fromPHP($cursor->toArray());
    9.         //Debug($cursor);
    10.         $cursor = json_decode(MongoDB\BSON\toJSON($cursor), true);
    11.         return $cursor;
    12.     } catch (MongoDB\Driver\Exception\Exception $e) {
    13.         echo $e->getMessage(), "\n";
    14.     }
    15. }
    И в ответ (если фильтр пустой) в таком формате:
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [0] => Array
    5.         (
    6.             [_id] => Array
    7.                 (
    8.                     [$oid] => 58deb6a371add833516a620c
    9.                 )
    10.  
    11.             [Header] => Array
    12.                 (
    13.                     [ModuleId] => 3
    14.                     [GeneratedTime] => 2017-03-31T20:05:54.5391752Z
    15.                     [MsgGuid] => 2299fa42-e275-4c43-8fa0-51fc11ecfc89
    16.                     [MsgId] => 201
    17.                 )
    18.  
    19.             [Peer] => Array
    20.                 (
    21.                     [Id] => 2264593
    22.                     [Events] => Array
    23.                         (
    24.                             [Event] => Array
    25.                                 (
    26.                                     [Id] => 6
    27.                                         (
    28.                                             [0] => Array
    29.                                                 (
    30.                                                     [Name] => Ivan
    31.                                                     [SecondName] => Kolomiec
    32.                                                     [Phone] => +30xxxxx
    33.                                                     [Status] => Open
    34.                                                     [Status] => Active
    35.                                                 )
    36. ........bla -bla-bla ...........................
    Есть 2 параметра: $filter и $options. По документации смотрю, фильтр может быть массивом или объектом. (Если объектом, то какого класса? )
    Если делаю одномерный массив
    Код (Text):
    1.  
    2. $filter = array("_id"=> new \MongoDB\BSON\ObjectId('58deb6a371add833516a620c'));
    то результат выдает. А мне ж по Пира ИД хочется.
    Делаю массив, как нормальный человек:
    Код (Text):
    1.  
    2. $filter = array('Peer'=>array('Id'='2264593'));
    И вызываю с этим параметром. И оно мне дули крутит. Листаю интернет, а там везде примеры запросов одноуровневые.
    А вот что в курсоре:
    Код (Text):
    1.  
    2. MongoDB\Driver\Cursor Object
    3. (
    4.     [database] => pusher
    5.     [collection] => test1
    6.     [query] => MongoDB\Driver\Query Object
    7.         (
    8.             [filter] => stdClass Object
    9.                 (
    10.                     [Peer] => stdClass Object
    11.                         (
    12.                             [Id] => 2264593
    13.                         )
    14.  
    15.                 )
    16.  
    17.             [options] => stdClass Object
    18.                 (
    19.                     [limit] => 100
    20.                 )
    21.  
    22.             [readConcern] =>
    23.         )
    24.  
    25.     [command] =>
    26.     [readPreference] =>
    27.     [isDead] =>
    28.     [currentIndex] => 0
    29.     [currentDocument] =>
    30.     [server] => MongoDB\Driver\Server Object
    31.         (
    32.             [host] => localhost
    33.             [port] => 27017
    34.             [type] => 1
    35.             [is_primary] =>
    36.             [is_secondary] =>
    37.             [is_arbiter] =>
    38.             [is_hidden] =>
    39.             [is_passive] =>
    40.             [last_is_master] => Array
    41.                 (
    42.                     [ismaster] => 1
    43.                     [maxBsonObjectSize] => 16777216
    44.                     [maxMessageSizeBytes] => 48000000
    45.                     [maxWriteBatchSize] => 1000
    46.                     [localTime] => MongoDB\BSON\UTCDateTime Object
    47.                         (
    48.                             [milliseconds] => 1490999506438
    49.                         )
    50.  
    51.                     [maxWireVersion] => 5
    52.                     [minWireVersion] => 0
    53.                     [readOnly] =>
    54.                     [ok] => 1
    55.                 )
    56.  
    57.             [round_trip_time] => 0
    58.         )
    59.  
    60. )
    Может кто знает, как правильно составит