Możesz spróbować czegoś takiego. Nie jest możliwe wykonanie wszystkich operacji Mongo db tylko na podstawie klucza jako wartości.
Pierwsze rozwiązanie zostało napisane, aby pozostać blisko projektu OP.
Zakładając, że możesz dodać klucz do year
.
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Ułatwia odniesienie do roku według jego wartości.
Na przykład, aby dodać nową wartość do data
tablica dla year
2017. Możesz wypróbować poniższy kod.
Używa aktualizacji pozycyjnej $ operatora.
query
część odwołująca się do tablicy, w której przechowywany jest rekord 2017.
update
część za pomocą push
aby dodać nowy car
zapis do istniejących data
tablica dla 2017
wiersz.
<?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";
}
?>
Aby uzyskać dostęp do danych według roku, możesz uruchomić poniższe zapytanie.
Użyj zapytania pozycyjnego $
operatora, aby znaleźć indeks tablicy za pomocą części zapytania i odnieść się do tej wartości w części rzutowania.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Alternatywne rozwiązanie:
To zajmie się wszystkim, jak tylko wstawkami
Lepiej jest zapisać każdy wpis dotyczący samochodu w osobnym dokumencie.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Dla każdego wpisu możesz użyć:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
Kod 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;
}
Aby uzyskać dane dostępowe według roku, możesz użyć
db.collection.find({"year":2017});
Zaktualizowany kod 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";
}
?>
Możesz wykonywać złożone zapytania za pomocą potoku agregacji i możesz dodać indeks, aby przyspieszyć odpowiedź.
Obserwacje:
Pierwsze rozwiązanie :Trudniej aktualizować/wstawiać dane, ale utrzymuje wszystko razem, dzięki czemu dane są łatwiejsze do odczytania.
Drugie rozwiązanie :Czystsze i prostsze wykonywanie operacji CRUD na dokumentach oraz wykorzystanie potoku agregacji do tworzenia złożonych zapytań.