Můžete zkusit něco takového. Není možné provádět všechny operace Mongo db pouze na základě klíče jako hodnoty.
První řešení je napsáno tak, aby zůstalo blízko návrhu OP.
Za předpokladu, že můžete přidat klíč k year
.
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Usnadňuje odkazování na rok podle jeho hodnoty.
Například pro přidání nové hodnoty do data
pole pro year
2017. Můžete vyzkoušet níže uvedený kód.
Používá aktualizaci poziční $ operátor.
query
část odkazující na pole, kde je uložen záznam 2017.
update
část pomocí push
přidat nové car
záznam do existujících data
pole pro 2017
řádek.
<?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";
}
?>
Pro přístup k datům podle roku můžete spustit dotaz níže.
Použít poziční dotaz $
operátor k vyhledání indexu pole pomocí části dotazu a odkazu na tuto hodnotu v části projekce.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Alternativní řešení:
Tím se o vše postará jako pouhé vložky
Je lepší uložit každý záznam vozu do jeho vlastního dokumentu.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Pro každý záznam můžete použít:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
PHP kód:
//{"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;
}
Pro přístupové údaje podle roku můžete použít
db.collection.find({"year":2017});
Aktualizovaný kód 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";
}
?>
Pomocí agregačního kanálu můžete provádět složité dotazy a můžete přidat index, aby byla vaše odpověď rychlejší.
Postřehy:
První řešení :Je obtížnější aktualizovat/vkládat data, ale udržuje vše pohromadě, takže data jsou snáze čitelná.
Druhé řešení :Čistější a jednodušší operace CRUD na dokumentech a použití agregačního kanálu k předkládání složitých dotazů.