Puoi provare qualcosa del genere. Non è possibile eseguire tutte le operazioni di Mongo db basandosi solo su off key come valore.
La prima soluzione è scritta per rimanere vicino al design di OP.
Supponendo che tu possa aggiungere una chiave all'year
.
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Rende facile fare riferimento all'anno in base al suo valore.
Ad esempio per aggiungere un nuovo valore nei data
matrice per year
2017. Puoi provare il codice seguente.
Utilizza l'aggiornamento posizionale $ operatore.
query
parte per fare riferimento all'array in cui è archiviato il record 2017.
update
parte usando push
per aggiungere la nuova car
registrare nei data
esistenti matrice per 2017
riga.
<?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";
}
?>
Per accedere ai dati per anno puoi eseguire la query di seguito.
Usa query posizionale $
operatore per trovare l'indice dell'array utilizzando la parte della query e fare riferimento a quel valore nella parte della proiezione.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Soluzione alternativa :
Questo si occuperà di tutto come semplici inserti
È meglio salvare ogni voce dell'auto nel proprio documento.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Per ogni voce puoi utilizzare:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
Codice 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;
}
Per accedere ai dati per anno puoi utilizzare
db.collection.find({"year":2017});
Codice PHP aggiornato:
<?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";
}
?>
Puoi eseguire query complesse utilizzando la pipeline di aggregazione e puoi aggiungere un indice per rendere la tua risposta più rapida.
Osservazioni:
Prima soluzione :È più difficile aggiornare/inserire i dati, ma tiene tutto insieme così è più facile leggere i dati.
Seconda soluzione :Operazioni CRUD più pulite e semplici da eseguire sui documenti e utilizzo della pipeline di aggregazione per eseguire query complesse.