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.