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.