1. 概要

このチュートリアルでは、MongoDBからキー名で値を取得する方法を学習します。 適用されたフィルターに基づいてドキュメントのキーフィールド名を取得するために、MongoDBのさまざまなメソッドを検討します。 まず、findまたはfindoneメソッドを使用して必要なデータをフェッチし、後でAggregationメソッドを使用します。 ここでは、MongoDBシェルクエリとJavaドライバーコードの両方でクエリを記述します。

フィールド名でMongoDBの値を取得するさまざまな方法を見てみましょう。

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

まず、新しいデータベースbaeldungと新しいコレクションtravelを設定する必要があります。

use baeldung;
db.createCollection(travel);

次に、MongoDBの insertMany メソッドを使用して、コレクションにダミーデータを追加しましょう。

db.travel.insertMany([
{ 
    "passengerId":145,
    "passengerName":"Nathan Green",
    "passengerAge":25,
    "sourceStation":"London",
    "destinationStation":"Birmingham",
    "seatType":"Slepper",
    "emailAddress":"[email protected]"
},
{ 
    "passengerId":148,
    "passengerName":"Kevin Joseph",
    "passengerAge":28,
    "sourceStation":"Manchester",
    "destinationStation":"London",
    "seatType":"Slepper",
    "emailAddress":"[email protected]"
},
{ 
    "passengerId":154,
    "passengerName":"Sheldon burns",
    "passengerAge":26,
    "sourceStation":"Cambridge",
    "destinationStation":"Leeds",
    "seatType":"Slepper",
    "emailAddress":"[email protected]"
},
{ 
    "passengerId":168,
    "passengerName":"Jack Ferguson",
    "passengerAge":24,
    "sourceStation":"Cardiff",
    "destinationStation":"Coventry",
    "seatType":"Slepper",
    "emailAddress":"[email protected]"
}
]);

上記のinsertManyクエリは、次のJSONを返します。

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("623d7f079d55d4e137e47825"),
	ObjectId("623d7f079d55d4e137e47826"),
	ObjectId("623d7f079d55d4e137e47827"),
        ObjectId("623d7f079d55d4e137e47828")
    ]
}

これまで、ダミーデータをコレクションtravelに挿入しました。

3. findメソッドの使用

find メソッドは、コレクションで指定されたクエリ条件に一致するドキュメントを検索して返します。 複数のドキュメントが条件に一致する場合、ディスク上のドキュメントの順序に基づいてすべてのドキュメントが返されます。 さらに、MongoDBでは、findメソッドがクエリでのパラメーター射影をサポートしています。  find メソッドで投影パラメータを指定すると、投影フィールドのみを含むすべてのドキュメントが返されます。

注意すべき重要な点の1つは、 _id フィールドは、明示的に削除されない限り、常に応答に含まれるということです。

実例を示すために、シェルクエリを調べてキーフィールドを投影してみましょう。

db.travel.find({},{"passengerId":1}).pretty();

上記のクエリに対する応答は次のようになります。

{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }

ここで、このクエリでは、単純に乗客ID。 次に、キーフィールドを除外して調べてみましょう。 _id

db.travel.find({},{"passengerId":1,"_id":0}).pretty();

上記のクエリには、次の応答があります。

{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }

ここで、このクエリでは、_idフィールドを応答予測から除外しました。 上記のクエリのJavaドライバコードを見てみましょう。

MongoClient mongoClient = new MongoClient("localhost", 27017);
DB database = mongoClient.getDB("baeldung");
DBCollection collection = database.getCollection("travel");
BasicDBObject queryFilter = new BasicDBObject();
BasicDBObject projection = new BasicDBObject();
projection.put("passengerId", 1);
projection.put("_id", 0);
DBCursor dbCursor = collection.find(queryFilter, projection);
while (dbCursor.hasNext()) {
    System.out.println(dbCursor.next());
}

上記のコードでは、最初に、ポート27017で実行されているローカルmongoサーバーとのMongoClient接続を作成しました。 次に、 find メソッドを使用しました。このメソッドには、 queryFilter、、およびprojectionの2つのパラメーターがあります。 クエリDBObjectには、データをフェッチするために必要なフィルターが含まれています。 ここでは、 DBCursor を使用して、渡航文書のすべての投影フィールドを印刷しました。

4. 集約メソッドの使用

MongoDBのaggregation操作は、データレコードとドキュメントを処理し、計算結果を返します。 さまざまなドキュメントから値を収集し、それらをグループ化してから、合計、平均、最小、最大など、グループ化されたデータに対してさまざまなタイプの操作を実行します。

より複雑な集計を行う必要がある場合は、MongoDB集計パイプラインを使用できます。 集約パイプラインは、MongoDBクエリ構文と組み合わされたステージのコレクションであり、集約された結果を生成します。

集計クエリを調べて、キー名で値を取得してみましょう。

db.travel.aggregate([
{
    "$project":{
        "passengerId":1
    }
}
]).pretty();

上記の集計クエリへの応答は次のようになります。

{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }

この場合、集約パイプラインの $projectステージを使用しました。 $ project は、含めるまたは除外するフィールドを指定します。 クエリでは、passengerIdのみをプロジェクションステージに渡しました。

上記のクエリのJavaドライバコードを見てみましょう。

ArrayList<Document> response = new ArrayList<>();
ArrayList<Document> pipeline = new ArrayList<>(Arrays.asList(new Document("$project", new Document("passengerId", 1L))));
database = mongoClient.getDatabase("baeldung");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- " + response);

次の方法で集約パイプラインを作成することもできます。

ArrayList<Document> response = new ArrayList<>();
ArrayList<Bson> pipeline = new ArrayList<>(Arrays.asList(
  project(fields(Projections.exclude("_id"), Projections.include("passengerId")))));
MongoDatabase database = mongoClient.getDatabase("baeldung");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- "+response);

Javaドライバーコードを使用して集約パイプラインを作成し、passengerIdフィールドのみを含むようにプロジェクトステージを設定しました。 最後に、集計パイプラインを集計メソッドに渡してデータを取得しました。

5. 結論

この記事では、MongoDBでキー名で値を取得する方法を学びました。 データをフェッチするためのMongoDBのさまざまな方法を検討しました。 まず、 find メソッドを使用してデータを取得し、次にAggregateメソッドを使用してデータを取得します。 MongoDBでのフィールドの投影のユースケースを調べました。 つまり、MongoシェルクエリとJavaドライバーコードを使用してフィールドの投影を実装しました。

GitHubですべてのケースの実装を見つけることができます。