2013-12-24 5 views
-1

Я использую Mongo DB и Slim PHP в своем приложении.Массив объектов

В Монго У меня есть этот массив объектов

"dashboards" : [ 
     { 
      "_id" : ObjectId("52b96365481b9c02091d8698"), 
      "title" : "Default title", 
      "subtitle" : "Default subtitle", 
      "metric_views" : [ ] 
     }, 
     { 
      "_id" : ObjectId("52b9665f481b9c06091d8698"), 
      "title" : "asdasdasd", 
      "subtitle" : "asdasdasdas", 
      "metric_views" : [ ] 
     }, 
     { 
      "_id" : ObjectId("52b96666481b9c04091d8697"), 
      "title" : "asdasdas", 
      "subtitle" : "dasdasdas", 
      "metric_views" : [ ] 
     } 
    ] 

и для удаления Я написал эту функцию

function removeDashboard ($user,$dashboardMongoId) { 
    foreach ($user['dashboards'] as $key => $dashboard) { 
     if($user['dashboards'][$key]['_id']==$dashboardMongoId) { 
      unset($user['dashboards'][$key]); 
      break; 
     } 
    } 
    return $user['dashboards']; 
} 

после удаления одного объекта мои приборные панели выглядит следующим образом

"dashboards" : { 
     "1" : { 
      "_id" : ObjectId("52b9665f481b9c06091d8698"), 
      "title" : "asdasdasd", 
      "subtitle" : "asdasdasdas", 
      "metric_views" : [ ] 
     }, 
     "2" : { 
      "_id" : ObjectId("52b96666481b9c04091d8697"), 
      "title" : "asdasdas", 
      "subtitle" : "dasdasdas", 
      "metric_views" : [ ] 
     } 
    } 

[ ] становятся {}, и я получаю номер для объектов «1», «2», но все приложение отлично справляется с этим. Кто-нибудь знает, почему это происходит, и я должен исправить это или нормально, чтобы так?

Спасибо!

UPDATE:

Im приборная панель, если нет Щитков в массиве может быть, то будет проблема при создании по умолчанию, вот код для этого

$app->get('/getDashboards', function() { 

    // Connect to database and select collection for loged in user 
    $collection = selectMongoCollection('ctstats', 'users'); 
    $user  = findLoggedUser($collection); 

    // Get all dashboards for user 
    $data = $user['dashboards']; 

    if(sizeof($user['dashboards']) == 0) { 
     // Creating default dashboard 
     $dashboard  = array(
          "_id"   => new MongoId(), 
          "title"  =>"Default title", 
          "subtitle"  =>"Default subtitle", 
          "metric_views" => array() 
         ); 

     // Saving dashboard to collection 
     array_push($user['dashboards'],$dashboard); 

     // Updating mongo with new data 
     $collection->update($user,$user['dashboards']); 
     $collection->save($user); 
    } 
    echo json_encode($user['dashboards']); 
}); 

ответ

0

Почему бы не использовать MongoCollection :: удалить PHP функции клиента MongoDB. он удалит содержимое из коллекции для данного условия.

+0

, как это сделать в этом примере? –

0

Это происходит здесь в функции PHP:

function removeDashboard ($user,$dashboardMongoId) { 
    foreach ($user['dashboards'] as $key => $dashboard) { 
     if($user['dashboards'][$key]['_id']==$dashboardMongoId) { 
      unset($user['dashboards'][$key]); 
      break; 
     } 
    } 
    return $user['dashboards']; 
} 

В PHP каждый вид массива является массивом (в том смысле, PHP). Это не относится к mongodb/javascript вообще, где массив представляет собой массив с числовой индексацией на основе 0, в отличие от хэшей/документов/объектов, которые являются массивами с ключом. При передаче массива данных через драйвер mongodb необходимо выполнить преобразование, и я предполагаю, что он в основном проверяет наличие нулевого индекса, чтобы определить, какой тип хранилища mongodb лучше всего подходит.

В вашем php-коде вы удаляете значение, соответствующее индексу 0, в то время как позволяет всем остальным клавишам оставаться одинаковым. Так как вы, кажется, не заботиться о ключах, вы можете легко исправить это с array_value(), который волшебным образом восстановить ключи массива как простой 0 на основе численно индексированного списка:

function removeDashboard ($user,$dashboardMongoId) { 
    foreach ($user['dashboards'] as $key => $dashboard) { 
     if($user['dashboards'][$key]['_id']==$dashboardMongoId) { 
      unset($user['dashboards'][$key]); 
      break; 
     } 
    } 
    return array_values($user['dashboards']); 
} 
Смежные вопросы