Vous pouvez essayer quelque chose comme ça. Il n'est pas possible d'effectuer toutes les opérations de la base de données Mongo en se basant uniquement sur la clé en tant que valeur.
La première solution est écrite pour rester proche de la conception d'OP.
En supposant que vous puissiez ajouter une clé à l'year
.
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Facilite le référencement de l'année par sa valeur.
Par exemple pour ajouter une nouvelle valeur dans les data
tableau pour year
2017. Vous pouvez essayer le code ci-dessous.
Utilise la position de mise à jour $ opérateur.
query
partie pour référencer le tableau où l'enregistrement 2017 est stocké.
update
partie en utilisant push
pour ajouter la nouvelle car
enregistrer dans les data
existantes tableau pour 2017
rangée.
<?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";
}
?>
Pour accéder aux données par année, vous pouvez exécuter la requête ci-dessous.
Utiliser la position de requête $
opérateur pour trouver l'index du tableau à l'aide de la partie requête et référencer cette valeur dans la partie projection.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Solution alternative :
Cela prendra soin de tout comme de simples inserts
Il vaut mieux enregistrer chaque entrée de voiture dans son propre document.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Pour chaque entrée, vous pouvez utiliser :
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
Code 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;
}
Pour accéder aux données par année, vous pouvez utiliser
db.collection.find({"year":2017});
Code PHP mis à jour :
<?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";
}
?>
Vous pouvez effectuer des requêtes complexes à l'aide du pipeline d'agrégation et vous pouvez ajouter un index pour accélérer votre réponse.
Observations :
Première solution :plus difficile à mettre à jour/insérer des données, mais garde tout ensemble pour faciliter la lecture des données.
Deuxième solution :Plus propre et plus simple pour effectuer des opérations CRUD sur des documents et utiliser un pipeline d'agrégation pour effectuer des requêtes complexes.