MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Thêm dữ liệu bên trong tài liệu trong Mongo DB bằng PHP

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Không thể chuẩn hóa truy vấn:BadValue Quá nhiều biểu thức văn bản

  2. DAO và tiêm phụ thuộc, lời khuyên?

  3. Xử lý các chỉ mục ghép độc đáo, thưa thớt, mongodb

  4. Graphql tạo quan hệ giữa hai truy vấn. Lỗi không thể truy cập trước khi khởi tạo

  5. Chỉ mục nền MongoDb và chỉ mục duy nhất