1. 概要

このチュートリアルでは、MongoDBの配列にドキュメントを挿入する方法を紹介します。 さらに、配列に値を追加するための$pushおよび$addToset演算子のさまざまなアプリケーションが表示されます。

まず、サンプルデータベースとコレクションを作成し、それにダミーデータを挿入します。 さらに、 $push演算子を使用してドキュメントを更新するためのいくつかの基本的な例を調べます。 後で、 $pushおよび$addtoSet演算子のさまざまな使用例についても説明します。

MongoDBの配列にドキュメントを挿入するためのさまざまな方法を詳しく見ていきましょう。

2. データベースの初期化

まず、新しいデータベースbaeldungとサンプルコレクションordersを設定しましょう。

use baeldung;
db.createCollection(orders);

insertMany メソッドを使用して、コレクションにいくつかのドキュメントを追加しましょう。

db.orders.insertMany([
    {
        "customerId": 1023,
        "orderTimestamp": NumberLong("1646460073000"),
        "shippingDestination": "336, Street No.1 Pawai Mumbai",
        "purchaseOrder": 1000,
        "contactNumber":"9898987676",
        "items": [ 
            {
                "itemName": "BERGER",
                "quantity": 1,
                "price": 500
            },
            {
                "itemName": "VEG PIZZA",
                "quantity": 1,
                "price": 800
            } 
          ]
    },
    {
        "customerId": 1027,
        "orderTimestamp": NumberLong("1646460087000"),
        "shippingDestination": "445, Street No.2 Pawai Mumbai",
        "purchaseOrder": 2000,
        "contactNumber":"9898987676",
        "items": [ 
            {
               "itemName": "BERGER",
               "quantity": 1,
               "price": 500
            },
            {
               "itemName": "NON-VEG PIZZA",
               "quantity": 1,
               "price": 1200
            } 
          ]
    }
]);

挿入が成功した場合、上記のコマンドは以下に示すようなJSONを出力します。

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("622300cc85e943405d04b567"),
	ObjectId("622300cc85e943405d04b568")
    ]
}

これまで、データベースとコレクションのセットアップに成功しました。 すべての例で、このデータベースとコレクションを使用します。

3. Mongoクエリを使用したプッシュ操作

MongoDBは、MongoDBドキュメントの配列を更新するためのさまざまなタイプの配列演算子を提供します。 MongoDBの$push演算子は、配列の最後に値を追加します。クエリの種類に応じて、 $push演算子をupdateOne[などのメソッドで使用できます。 X186X]、 updateMany findAndModifyなど。

$push演算子を使用してシェルクエリを調べてみましょう。

db.orders.updateOne(
    {
        "customerId": 1023
    },
    {
        $push: {
            "items":{
                "itemName": "PIZZA MANIA",
                "quantity": 1,
                "price": 800
            }
        }
    });

上記のクエリは、次のドキュメントを返します。

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

customerId1023でドキュメントを確認してみましょう。 ここでは、新しいアイテムがリスト「items」の最後に挿入されていることがわかります。

{
    "customerId" : 1023,
    "orderTimestamp" : NumberLong("1646460073000"),
    "shippingDestination" : "336, Street No.1 Pawai Mumbai",
    "purchaseOrder" : 1000,
    "contactNumber" : "9898987676",
    "items" : [
        {
            "itemName" : "BERGER",
            "quantity" : 1,
	    "price" : 500
        },
	{
            "itemName" : "VEG PIZZA",
	    "quantity" : 1,
	    "price" : 800
	},
	{
	    "itemName" : "PIZZA MANIA",
	    "quantity" : 1,
	    "price" : 800
        }
    ]
}

4. Javaドライバーコードを使用したプッシュ操作

これまで、ドキュメントを配列にプッシュするためのMongoDBシェルクエリについて説明してきました。 Javaコードを使用してプッシュ更新クエリを実装しましょう。

更新操作を実行する前に、まずbaeldungデータベースのordersコレクションに接続しましょう。

mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("orders");

ここでは、この場合、ローカルホストのデフォルトポート27017で実行されているMongoDBに接続しています。

4.1. DBObjectの使用

MongoDB Javaドライバーは、DBObjectBSONの両方のドキュメントをサポートします。 ここで、 DBObject はMongoDBレガシードライバーの一部ですが、新しいバージョンのMongoDBでは非推奨になっています。

次に、Javaドライバーコードを調べて、配列に新しい値を挿入しましょう。

DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA")
  .append("quantity", 1)
  .append("price", 800));
BasicDBObject searchFilter = new BasicDBObject("customerId", 1023);
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.append("$push", listItem);
UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);

上記のクエリでは、最初にBasicDBObjectを使用してアイテムドキュメントを作成しました。 searchQuery、に基づいて、コレクションのドキュメントがフィルタリングされ、値が配列にプッシュされます。

4.2. BSONドキュメントの使用

BSON ドキュメントは、新しいクライアントスタックで構築されたJavaでMongoDBドキュメントにアクセスするための新しい方法です。 org.bson.Document クラスはそれほど複雑ではなく、使いやすくなっています。

org.bson.Document クラスを使用して、値を配列「items」にプッシュしてみましょう。

Document item = new Document()
  .append("itemName1", "PIZZA MANIA")
  .append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));

この場合、 BSON の実装は、 DBObject、を使用して実行されるコードと同様であり、更新も同じになります。 ここでは、 updateOne メソッドを使用して、1つのドキュメントのみを更新しました。

5. addToSet演算子の使用

$ addToSet 演算子を使用して、配列内の値をプッシュすることもできます。 この演算子は、その値が配列に存在しない場合にのみ値を追加します。 それ以外の場合は、無視されます。 一方、push演算子は、フィルターする条件として値をプッシュして一致を取得します。

注意すべき重要な点の1つは、アイテムが重複している場合、$addToSet演算子は値をプッシュしないことです。 一方、 $push演算子他の条件に関係なく、値を配列にプッシュするだけです。

5.1. addToSet演算子を使用したシェルクエリ

$addToSet演算子のmongoシェルクエリは$push 演算子に似ていますが、 $addToSetは重複する値を配列に挿入しません。

次に、MongoDBクエリをチェックして、 $addTosetを使用して値を配列にプッシュします。

db.orders.updateOne(
    {
        "customerId": 1023
    },
    {
        $addToSet: {
            "items":{
                "itemName": "PASTA",
                "quantity": 1,
                "price": 1000
            }
        }
    });

この場合、出力は次のようになります。

{
    "acknowledged":true,
    "matchedCount":1,
    "modifiedCount":1
}

この場合、 $ addToSet 演算子を使用し、ドキュメントが一意である場合にのみ、ドキュメントが配列「items」にプッシュされます。

5.2. addToSet演算子を使用したJavaドライバー

$ addToSet 演算子は、プッシュ演算子とは異なるタイプの配列更新操作を提供します。

Document item = new Document()
  .append("itemName1", "PIZZA MANIA")
  .append("quantity", 1).append("price", 800);
UpdateResult updateResult = collection
  .updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item));
System.out.println("updateResult:- " + updateResult);

上記のコードでは、最初にドキュメント「 item 」を作成し、 customerId フィルターに基づいて、updateOneメソッドがプッシュを試みます。 「item」を配列「items」にドキュメント化します。

6. 結論

この記事では、$pushおよび$addToSet演算子を使用して新しい値を配列にプッシュする方法を学びました。 最初に、MongoDBシェルクエリでの $ push 演算子の使用を調べ、次に対応するJavaドライバーコードについて説明しました。

すべてのケースの実装は、GitHubにあります。