Sie können so etwas versuchen. Es ist nicht möglich, alle Mongo-DB-Operationen nur basierend auf dem Schlüssel als Wert auszuführen.
Die erste Lösung wurde so geschrieben, dass sie nahe am Design von OP bleibt.
Angenommen, Sie können dem year
einen Schlüssel hinzufügen .
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Macht es einfach, das Jahr anhand seines Werts zu referenzieren.
Zum Beispiel, um einen neuen Wert in die data
einzufügen Array für year
2017. Sie können den folgenden Code ausprobieren.
Verwendet Positionsaktualisierung $ Betreiber.
query
Teil, um auf das Array zu verweisen, in dem der Datensatz 2017 gespeichert ist.
update
Teil mit push
um das neue car
hinzuzufügen Datensatz zu den bestehenden data
hinzufügen -Array für 2017
Zeile.
<?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";
}
?>
Für den Zugriff auf Daten nach Jahr können Sie die folgende Abfrage ausführen.
Verwenden Sie die Positionsabfrage $
Operator, um den Array-Index mithilfe des Abfrageteils zu finden und diesen Wert im Projektionsteil zu referenzieren.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Alternative Lösung:
Dies erledigt alles wie nur Einfügungen
Speichern Sie am besten jeden Autoeintrag in einem eigenen Dokument.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Für jeden Eintrag können Sie verwenden:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
PHP-Code:
//{"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;
}
Für Zugriffsdaten nach Jahr können Sie verwenden
db.collection.find({"year":2017});
Aktualisierter PHP-Code:
<?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";
}
?>
Sie können komplexe Abfragen mithilfe der Aggregationspipeline ausführen und einen Index hinzufügen, um Ihre Antwort schneller zu machen.
Beobachtungen:
Erste Lösung :Schwieriger, Daten zu aktualisieren/einzufügen, hält aber alles zusammen, sodass Daten leichter zu lesen sind.
Zweite Lösung :Sauberere und einfachere Durchführung von CRUD-Vorgängen an Dokumenten und Verwendung der Aggregationspipeline zur Durchführung komplexer Abfragen.