sql >> Base de Datos >  >> NoSQL >> MongoDB

Agregue datos dentro de documentos en Mongo DB usando PHP

Puedes probar algo como esto. No es posible realizar todas las operaciones de la base de datos de Mongo basándose únicamente en la clave como valor.

La primera solución está escrita para mantenerse cerca del diseño de OP.

Suponiendo que puede agregar una clave al year .

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

Facilita la referencia del año por su valor.

Por ejemplo, para agregar un nuevo valor a los data matriz para year 2017. Puede probar el siguiente código.

Utiliza actualización posicional $ operador.

query part para hacer referencia a la matriz donde se almacena el registro de 2017.

update parte usando push para añadir el nuevo car registrar en los data existentes matriz para 2017 fila.

<?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";
    }

?>

Para acceder a los datos por año, puede ejecutar la siguiente consulta.

Usar consulta posicional $ operador para encontrar el índice de matriz utilizando la parte de consulta y hacer referencia a ese valor en la parte de proyección.

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

Solución alternativa:

Esto se encargará de todo como simples inserciones

Es mejor que guarde cada entrada de automóvil en su propio documento.

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

Para cada entrada puede usar:

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

Código 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;
 }

Para acceder a los datos por año puede utilizar

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

Código PHP actualizado:

<?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"; 
  } 
?>

Puede realizar consultas complejas mediante canalización de agregación y puede agregar un índice para que su respuesta sea más rápida.

Observaciones:

Primera solución :Es más difícil actualizar/insertar datos, pero mantiene todo junto para que sea más fácil leer los datos.

Segunda solución :Más limpio y sencillo para realizar operaciones CRUD en documentos y usar canalización de agregación para realizar consultas complejas.