sql >> データベース >  >> NoSQL >> MongoDB

PHPを使用してMongoDBのドキュメント内にデータを追加する

    あなたはこのようなことを試すことができます。キーを値として使用するだけで、すべてのMongodb操作を実行することはできません。

    最初のソリューションは、OPの設計に近い状態を保つように作成されています。

    yearにキーを追加できると仮定します 。

    {
      "cars": [{
          "year": "2017",
          "data": [{
              "car": "Motorolla",
              "color": "blue"
          }]
      }, {
          "year": "2016",
          "data": [{
              "car": "Toyota",
              "color": "green"
          }]
      }]
    }
    

    値で年を簡単に参照できます。

    たとえば、 dataに新しい値を追加します yearの配列 2017.以下のコードを試すことができます。

    位置の更新を使用 $ オペレーター。

    クエリ 2017レコードが格納されている配列を参照する部分。

    update pushを使用する部分 新しいcarを追加します 既存のデータに記録する 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"; 
      } 
    ?>
    

    集計パイプラインを使用して複雑なクエリを実行したり、インデックスを追加して応答を高速化したりできます。

    観察:

    最初の解決策 :データの更新/挿入は困難ですが、すべてをまとめて保持するため、データを読みやすくなります。

    2番目の解決策 :ドキュメントに対してCRUD操作を実行し、集計パイプラインを使用して複雑なクエリを実行するための、よりクリーンで簡単な方法。



    1. マングースで時刻を保存するための最良の方法

    2. Mac for MongoDB用の優れたデータベース管理アプリはありますか? Sequel Proに似ていますか?

    3. Windows8.1へのMongoDBのインストールに関する問題

    4. 冗談でマングースモデルをあざける