Anda dapat mencoba sesuatu seperti ini. Tidak mungkin melakukan semua operasi db Mongo hanya berdasarkan kunci sebagai nilai.
Solusi pertama ditulis untuk tetap dekat dengan desain OP.
Dengan asumsi Anda dapat menambahkan kunci ke year .
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Memudahkan untuk mereferensikan tahun berdasarkan nilainya.
Misalnya untuk menambahkan nilai baru ke dalam data larik untuk year 2017. Anda dapat mencoba kode di bawah ini.
Menggunakan pembaruan posisi $ operator.
query bagian untuk mereferensikan larik tempat catatan 2017 disimpan.
update bagian menggunakan push untuk menambahkan car baru rekam ke data yang ada larik untuk 2017 baris.
<?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";
}
?>
Untuk mengakses data berdasarkan tahun, Anda dapat menjalankan kueri di bawah ini.
Gunakan posisi kueri $
operator untuk menemukan indeks array menggunakan bagian kueri dan merujuk nilai tersebut di bagian proyeksi.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Solusi Alternatif :
Ini akan mengurus semuanya hanya sebagai sisipan
Anda lebih baik menyimpan setiap entri mobil dalam dokumennya sendiri.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Untuk setiap entri, Anda dapat menggunakan:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
Kode 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;
}
Untuk mengakses data berdasarkan tahun, Anda dapat menggunakan
db.collection.find({"year":2017});
Kode PHP yang diperbarui:
<?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";
}
?>
Anda dapat melakukan kueri kompleks menggunakan saluran agregasi dan Anda dapat menambahkan indeks untuk membuat respons Anda lebih cepat.
Pengamatan:
Solusi Pertama :Lebih sulit untuk memperbarui/menyisipkan data, tetapi menyatukan semuanya sehingga lebih mudah untuk membaca data.
Solusi Kedua :Lebih bersih dan lebih sederhana untuk melakukan operasi CRUD pada dokumen dan menggunakan saluran agregasi untuk membentuk kueri yang kompleks.