Можете да опитате нещо подобно. Не е възможно да се изпълнят всички операции на Mongo db само на базата на ключ като стойност.
Първото решение е написано, за да остане близо до дизайна на OP.
Ако приемем, че можете да добавите ключ към year
.
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Улеснява справянето с годината по нейната стойност.
Например за добавяне на нова стойност в data
масив за year
2017. Можете да опитате кода по-долу.
Използва позиция за актуализиране $ оператор.
query
част за препратка към масива, където се съхранява запис 2017.
update
част с помощта на push
за да добавите новата car
запис към съществуващите data
масив за 2017
ред.
<?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";
}
?>
За достъп до данни по години можете да изпълните заявката по-долу.
Използвайте позиционна заявка $
оператор за намиране на индекса на масива с помощта на частта за заявка и препратка към тази стойност в проекционната част.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Алтернативно решение:
Това ще се погрижи за всичко като само за вмъквания
По-добре е да запазите всеки запис на автомобил в отделен документ.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
За всеки запис можете да използвате:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
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;
}
За достъп до данни по години можете да използвате
db.collection.find({"year":2017});
Актуализиран 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";
}
?>
Можете да изпълнявате сложни заявки, като използвате тръбопровод за агрегиране и можете да добавяте индекс, за да направите отговора си по-бърз.
Наблюдения:
Първо решение :По-трудно за актуализиране/вмъкване на данни, но държи всичко заедно, така че данните са по-лесни за четене.
Второ решение :По-чисто и по-лесно за извършване на CRUD операции върху документи и използване на тръбопровод за агрегиране за предварително формиране на сложни заявки.