Bạn có thể thử một cái gì đó như thế này. Không thể thực hiện tất cả các thao tác Mongo db chỉ dựa trên khóa làm giá trị.
Giải pháp đầu tiên được viết để phù hợp với thiết kế của OP.
Giả sử bạn có thể thêm khóa vào year
.
{
"cars": [{
"year": "2017",
"data": [{
"car": "Motorolla",
"color": "blue"
}]
}, {
"year": "2016",
"data": [{
"car": "Toyota",
"color": "green"
}]
}]
}
Giúp bạn dễ dàng tham khảo năm theo giá trị của nó.
Ví dụ:thêm một giá trị mới vào data
mảng cho year
2017. Bạn có thể thử đoạn mã dưới đây.
Sử dụng cập nhật vị trí $ nhà điều hành.
query
một phần để tham chiếu đến mảng nơi lưu trữ bản ghi 2017.
update
phần sử dụng push
để thêm car
mới ghi vào data
hiện có mảng cho 2017
hàng.
<?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";
}
?>
Để truy cập dữ liệu theo năm, bạn có thể chạy truy vấn bên dưới.
Sử dụng vị trí truy vấn $
toán tử để tìm chỉ số mảng bằng cách sử dụng phần truy vấn và tham chiếu giá trị đó trong phần chiếu.
db.collection.find({"cars.year":2017}, {"cars.$.data":1});
Giải pháp thay thế:
Điều này sẽ chăm sóc mọi thứ như chỉ chèn
Tốt hơn hết bạn nên lưu từng mục nhập ô tô vào tài liệu riêng của nó.
{ "year" : 2017, "car" : "Motorolla", "color" : "blue" }
{ "year" : 2016, "car" : "Toyota", "color" : "green" }
{ "year" : 2015, "car" : "Corolla", "color" : "black" }
Đối với mỗi mục nhập, bạn có thể sử dụng:
db.collection.insert({"year":2017, "car":"Motorolla", "color":"blue"});
Mã 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;
}
Đối với dữ liệu truy cập theo năm, bạn có thể sử dụng
db.collection.find({"year":2017});
Mã PHP được cập nhật:
<?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";
}
?>
Bạn có thể thực hiện các truy vấn phức tạp bằng cách sử dụng đường dẫn tổng hợp và bạn có thể thêm chỉ mục để làm cho phản hồi của bạn nhanh hơn.
Quan sát:
Giải pháp đầu tiên :Khó cập nhật / chèn dữ liệu hơn, nhưng giữ mọi thứ lại với nhau để dễ đọc dữ liệu hơn.
Giải pháp thứ hai :Thao tác CRUD trên tài liệu sạch hơn và đơn giản hơn và sử dụng đường dẫn tổng hợp để định dạng trước các truy vấn phức tạp.