Добавление данных внутри документов в Mongo DB с помощью PHP

Я хочу вставить данные в Mongo database использование PHP скрипта, в year мудрые документы, чтобы он мог выглядеть так (все годы в одном документе);

cars{
        2017{
            car=Motorolla
            color = blue
        }
        2016{
            car=Toyota
            color = green
        }
        2015{
            car=Corolla
            color = black
        }
    }

Я хотел добавить документ, но он запрашивает

документ не может иметь $ prefixed имена полей: $years[0]

можно ли сделать такую схему в Mongo с помощью PHP?

код

<?php
    try {        
        $car = 'Motorolla';
        $color = 'blue';

        //$car = 'Toyota';
        //$color = 'green';

        //$car = 'Corolla';
        //$color = 'black';

        $years = array(2017, 2016, 2015);       
        $manager = new MongoDBDriverManager("mongodb://localhost:27017");
        $bulkWriteManager = new MongoDBDriverBulkWrite;
        $document = ['_id' => new MongoDBBSONObjectID, '$years[0]' => $car, '$years[1]' => $color];   // Making a query type

        try {
            $bulkWriteManager->insert($document);   // Inserting Document
            echo 1;           
        } catch(MongoCursorException $e) {
            /* handle the exception */
            echo 0;
        }

        $manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager);  // Going to DB and Collection

    } catch (MongoDBDriverExceptionException $e) {
        $filename = basename(__FILE__);
        echo "The $filename script has experienced an error.n"; 
        echo "It failed with the following exception:n";       
        echo "Exception:", $e->getMessage(), "n";


    }

?>

Я не хочу добавлять весь автомобиль немедленно возражайте. Я хочу добавить Year object каждый раз. Любая помощь будет ощутима. или Любой относительный ответ, чтобы я мог получить данные от Mongo Database Согласно году?

Edit1

впервые творение. - Кредиты идут на @Veeram

<?php
    try {        
        $car = 'Malibu';
        $color = 'red';
        $years = array(2017);       

        $manager = new MongoDBDriverManager("mongodb://localhost:27017");
        $bulkWriteManager = new MongoDBDriverBulkWrite;
        //{"car":"chevy", "color":"black", year: 2017}
        $insert = ['car' => $car, 'color' => $color, 'year' => $years[0]];
        try {
            $bulkWriteManager -> insert($insert); // Inserting Document
            echo 1;
        } catch (MongoCursorException $e) {
            echo 0;
        }
        $manager->executeBulkWrite('dbName.mycol', $bulkWriteManager);  // Going to DB and Collection           
    } catch (MongoDBDriverExceptionException $e) {
        $filename = basename(__FILE__);
        echo "The $filename script has experienced an error.n"; 
        echo "It failed with the following exception:n";       
        echo "Exception:", $e->getMessage(), "n";
        echo "In file:", $e->getFile(), "n";
        echo "On line:", $e->getLine(), "n";    
    }
?>

для обновления-кредиты идут на @Veeram

<?php
    try {        
        $car = 'ChangedCar';
        $color = 'changedColor';
        $years = array(2017);

        $manager = new MongoDBDriverManager("mongodb://localhost:27017");
        $bulkWriteManager = new MongoDBDriverBulkWrite;

        $query = ['cars.year' => $years[0]]; 

        //{ $push: { "cars.$.data": { "car":"chevy", "color":"black"} }}
        $update = ['$push'=> ['cars.$.data'=>['car' => $car, 'color' => $color]]];
        try {
            $bulkWriteManager->update($query, $update);   // Inserting Document        
        } catch(MongoCursorException $e) {

        }
        $manager->executeBulkWrite('dbName.mycol', $bulkWriteManager);  // Going to DB and Collection
    } catch (MongoDBDriverExceptionException $e) {
        $filename = basename(__FILE__);
        echo "The $filename script has experienced an error.n"; 
        echo "It failed with the following exception:n";       
        echo "Exception:", $e->getMessage(), "n";
    }
?>

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

пример: Существует документ с именем cars . Вставить данные с объектом года в один документ. Допустим, объект 2017 года, он содержит цвет и модель автомобиля. Как показано ниже; (несколько объектов с годами. Год уникален во всем документе.)

cars{
        2017{
            car=Motorolla
            color = blue
        }
        2016{
            car=Toyota
            color = green
        }
        2015{
            car=Corolla
            color = black
        }
    } 

если я хочу обновить, просто сделайте объект 2017 как 2017{car=Updated-Motorolla color =Updated-blue} и вставить в документ. Он должен обновлять только объект 2017 года в стороне документа.

 cars{
            2017{
                car=Updated-Motorolla
                color =Updated-blue
            }
            2016{
                car=Toyota
                color = green
            }
            2015{
                car=Corolla
                color = black
            }
        } 

2 ответов


вы можете попробовать что-то вроде этого. Невозможно выполнить все операции Mongo db только на основе ключа off в качестве значения.

первое решение написано, чтобы оставаться рядом с дизайном OP.

предполагая, что вы можете добавить ключ к year.

{
  "cars": [{
      "year": "2017",
      "data": [{
          "car": "Motorolla",
          "color": "blue"
      }]
  }, {
      "year": "2016",
      "data": [{
          "car": "Toyota",
          "color": "green"
      }]
  }]
}

позволяет легко ссылаться на год от его стоимости.

например, чтобы добавить новое значение в data массив year 2017. Вы можете попробовать приведенный ниже код.

использует обновить позиционный $ оператора.

query часть для ссылки на массив, где хранится запись 2017.

update С помощью push добавить новый car запись в существующий data массив 2017 строки.

<?php
    try {        
        $car = 'Malibu';
        $color = 'blue';
        $years = [2017];

        $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
        $bulkWriteManager = new MongoDB\Driver\BulkWrite;

        //{"cars.year":2017}
        $query = ['cars.year' => $years[0]]; 

        //{ $push: { "cars.$.data": { "car":"chevy", "color":"black"} }}
        $update = ['$push'=> ['cars.$.data'=>['car' => $car, 'color' => $color]]];

        try {
            $bulkWriteManager->update($query, $update);  // Update Document
            echo 1;           
        } catch(MongoCursorException $e) {
            /* handle the exception */
            echo 0;
        }

        $manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager);  // Going to DB and Collection

    } catch (MongoDB\Driver\Exception\Exception $e) {
        $filename = basename(__FILE__);
        echo "The $filename script has experienced an error.\n"; 
        echo "It failed with the following exception:\n";       
        echo "Exception:", $e->getMessage(), "\n";
    }

?>

для доступа к данным ПО года вы можете запустить запрос ниже.

использовать позиционный запрос $оператор для поиска индекса массива с помощью части запроса и ссылки на это значение в проекционная часть.

db.collection.find({"cars.year":2017}, {"cars.$.data":1});

Альтернативное Решение :

это позаботится обо всем, как только вставляет

вам лучше сохранить каждую запись автомобиля в своем собственном документе.

{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }

для каждой записи вы можете использовать:

db.collection.insert({"year":2017,  "car":"Motorolla", "color":"blue"});

PHP код:

 //{"car":"chevy", "color":"black", year: 2017}
 $insert = ['car' => $car, 'color' => $color, 'year' => $years[0]];

 try {
    $bulkWriteManager - > insert($insert); // Inserting Document
    echo 1;
 } catch (MongoCursorException $e) {
    /* handle the exception */
    echo 0;
 }

для доступа к данным ПО года вы можете использовать

db.collection.find({"year":2017});

обновленный PHP код:

<?php 
try { 
  $cars = ['Motorolla','Toyota', 'Corolla'] ; 
  $colors = ['blue', 'green', 'black']; 

  $years = [2017, 2016, 2015]; 
  $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); 
  $bulkWriteManager = new MongoDB\Driver\BulkWrite; 

  $query1 =["year" => $years[0]]; 
  $query2 =["year" => $years[1]]; 
  $query3 =["year" => $years[2]]; 

  $update1 = ['$set' => ['car' => $cars[0], 'color' => $colors[0]]]; 
  $update2 = ['$set' => ['car' => $cars[1], 'color' => $colors[1]]]; 
  $update3 = ['$set' => ['car' => $cars[2], 'color' => $colors[2]]]; 

  try { 
    $bulkWriteManager->update($query1, $update1, ["upsert" => true]); 
    $bulkWriteManager->update($query2, $update2, ["upsert" => true]); 
    $bulkWriteManager->update($query3, $update3, ["upsert" => true]); 
     echo 1; 
  } catch(MongoCursorException $e) { 
  /* handle the exception */ 
  echo 0; 
  } 

  $manager->executeBulkWrite('dbName.carsCol', $bulkWriteManager); // Going to DB and Collection 

  } catch (MongoDB\Driver\Exception\Exception $e) { 
    $filename = basename(__FILE__); 
    echo "The $filename script has experienced an error.\n"; 
    echo "It failed with the following exception:\n"; 
    echo "Exception:", $e->getMessage(), "\n"; 
  } 
?>

вы можете выполнить комплекс запросы с помощью конвейера агрегации, и вы можете добавить индекс, чтобы сделать ваш ответ быстрее.

замечания:

Первый Вариант : сложнее обновлять / вставлять данные, но сохраняет все вместе, поэтому легче читать данные.

Второй Вариант : Чище и проще выполнять операции CRUD над документами и использовать конвейер агрегации для предварительного формирования сложных запросов.


попробуйте изменить

$document = ['_id' => new MongoDB\BSON\ObjectID, '$years[0]' => $car, '$years[1]' => $color];

что-то вроде:

$document = ['_id' => new \MongoDB\BSON\ObjectID, $years[0] => ['car' => $car, 'color' => $color]];

это дает такой результат в монго:

{ "_id" : ObjectId("58a936ecfc11985f525a4582"), "2017" : { "car" : "Motorolla", "color" : "blue" }

если данные обо всех автомобилях должны быть в одном документе, вам нужно объединить данные fitst:

$cars = [
    '2017' => [
        'car' => 'Motorolla',
        'color' => 'blue'
    ],
    '2016' => [
        'car' => 'Toyota',
        'color' => 'green'
    ],
    '2015' => [
        'car' => 'Corolla',
        'color' => 'black'
    ]
];

и

$document = ['_id' => new \MongoDB\BSON\ObjectID, 'cars' => $cars]; 

это дает монго документ, как:

{ "_id" : ObjectId("58aabc0cfc11980f57611832"), "cars" : { "2017" : { "car" : "Motorolla", "color" : "blue" }, "2016" : { "car" : "Toyota", "color" : "green" }, "2015" : { "car" : "Corolla", "color" : "black" } } }