MongoDBのfind()は常に全フィールドを返す?特定のフィールドだけを取得する方法を解説
MongoDBのcollection.find()は、何も指定しなければコレクション内のすべてのフィールドを返します。しかし、第2引数に「プロジェクション(射影)」を指定することで、必要なフィールドだけを取得したり、逆に不要なフィールドを除外したりできます。
この記事では、具体的なサンプルコードを使いながら、フィールド指定の基本パターンをわかりやすく解説します。
プロジェクションの基本構文
ケース1:特定のフィールドのみ返す(値を1に設定)
db.yourCollectionName.find({},{"yourFieldName":1}).pretty();フィールド名の値を 1 に設定すると、そのフィールド(および常に含まれる _id)だけが返されます。
ケース2:特定のフィールドを除外する(値を0に設定)
db.yourCollectionName.find({},{"yourFieldName":0}).pretty();フィールド名の値を 0 に設定すると、そのフィールド以外のすべてのフィールドが返されます。
注意: 1と0の指定は同一クエリ内で混在できません(_id を除く)。どちらか一方の方式で指定してください。
サンプルデータの準備
動作を確認するため、ドキュメントを含むコレクションを作成しましょう。以下のクエリでコレクションを作成し、ドキュメントを挿入します。
> db.returnFieldInFindDemo.insertOne({"StudentName":"John","StudentAge":23,"TechnicalSubject":["MongoDB","MySQL"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ebfe72f684a30fbdfd566")
}
> db.returnFieldInFindDemo.insertOne({"StudentName":"Mike","StudentAge":24,"TechnicalSubject":["Java","Python"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ebffd2f684a30fbdfd567")
}
> db.returnFieldInFindDemo.insertOne({"StudentName":"Sam","StudentAge":22,"TechnicalSubject":["C","C++"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec00f2f684a30fbdfd568")
}
> db.returnFieldInFindDemo.insertOne({"StudentName":"Carol","StudentAge":20,"TechnicalSubject":["DataStructure","Algorithm"]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8ec0292f684a30fbdfd569")
}次に、find()メソッドを使ってコレクション内の全ドキュメントを表示してみます。
> db.returnFieldInFindDemo.find().pretty();
出力結果は以下のとおりです。
{
"_id" : ObjectId("5c8ebfe72f684a30fbdfd566"),
"StudentName" : "John",
"StudentAge" : 23,
"TechnicalSubject" : [
"MongoDB",
"MySQL"
]
}
{
"_id" : ObjectId("5c8ebffd2f684a30fbdfd567"),
"StudentName" : "Mike",
"StudentAge" : 24,
"TechnicalSubject" : [
"Java",
"Python"
]
}
{
"_id" : ObjectId("5c8ec00f2f684a30fbdfd568"),
"StudentName" : "Sam",
"StudentAge" : 22,
"TechnicalSubject" : [
"C",
"C++"
]
}
{
"_id" : ObjectId("5c8ec0292f684a30fbdfd569"),
"StudentName" : "Carol",
"StudentAge" : 20,
"TechnicalSubject" : [
"DataStructure",
"Algorithm"
]
}ケース1:特定のフィールドのみ取得する
「TechnicalSubject」フィールドを 1 に設定して検索すると、全ドキュメントからこのフィールドだけが返されます。
> db.returnFieldInFindDemo.find({}, {"TechnicalSubject": 1}).pretty();出力結果:
{
"_id" : ObjectId("5c8ebfe72f684a30fbdfd566"),
"TechnicalSubject" : [
"MongoDB",
"MySQL"
]
}
{
"_id" : ObjectId("5c8ebffd2f684a30fbdfd567"),
"TechnicalSubject" : [
"Java",
"Python"
]
}
{
"_id" : ObjectId("5c8ec00f2f684a30fbdfd568"),
"TechnicalSubject" : [
"C",
"C++"
]
}
{
"_id" : ObjectId("5c8ec0292f684a30fbdfd569"),
"TechnicalSubject" : [
"DataStructure",
"Algorithm"
]
}上記の出力を見ると、「TechnicalSubject」フィールドを1に設定したことで、各ドキュメントからはこのフィールド(と自動的に含まれる _id)のみが返されていることがわかります。_id を除外したい場合は、{"_id": 0, "TechnicalSubject": 1} のように指定します。
ケース2:特定のフィールドを除外して取得する
次に、「TechnicalSubject」フィールドを 0 に設定した場合です。この場合、そのフィールドを除くすべてのフィールドが返されます。
> db.returnFieldInFindDemo.find({}, {"TechnicalSubject": 0}).pretty();出力結果:
{
"_id" : ObjectId("5c8ebfe72f684a30fbdfd566"),
"StudentName" : "John",
"StudentAge" : 23
}
{
"_id" : ObjectId("5c8ebffd2f684a30fbdfd567"),
"StudentName" : "Mike",
"StudentAge" : 24
}
{
"_id" : ObjectId("5c8ec00f2f684a30fbdfd568"),
"StudentName" : "Sam",
"StudentAge" : 22
}
{
"_id" : ObjectId("5c8ec0292f684a30fbdfd569"),
"StudentName" : "Carol",
"StudentAge" : 20
}「TechnicalSubject」だけが出力から除外され、それ以外のフィールドがすべて返されています。
ケース3:プロジェクションなしでfind()を実行した場合
ご存知のとおり、第2引数を指定せずに find() を実行すると、すべてのフィールドが返されます。
> db.returnFieldInFindDemo.find();
出力結果:
{ "_id" : ObjectId("5c8ebfe72f684a30fbdfd566"), "StudentName" : "John", "StudentAge" : 23, "TechnicalSubject" : [ "MongoDB", "MySQL" ] }
{ "_id" : ObjectId("5c8ebffd2f684a30fbdfd567"), "StudentName" : "Mike", "StudentAge" : 24, "TechnicalSubject" : [ "Java", "Python" ] }
{ "_id" : ObjectId("5c8ec00f2f684a30fbdfd568"), "StudentName" : "Sam", "StudentAge" : 22, "TechnicalSubject" : [ "C", "C++" ] }
{ "_id" : ObjectId("5c8ec0292f684a30fbdfd569"), "StudentName" : "Carol", "StudentAge" : 20, "TechnicalSubject" : [ "DataStructure", "Algorithm" ] }まとめ
find()にプロジェクションを指定しない場合、すべてのフィールドが返される。- フィールドを 1 に設定すると、そのフィールドのみが返される(包含指定)。
- フィールドを 0 に設定すると、そのフィールドを除くすべてが返される(除外指定)。
_idはデフォルトで常に返されるため、不要なら明示的に_id: 0を指定する。
必要なデータだけを取得することで、ネットワーク転送量やアプリケーションのメモリ使用量を削減でき、パフォーマンス向上にもつながります。ぜひ活用してみてください。
-
MongoDBのfind()で特定のフィールドを除外して取得する方法
MongoDBのfind()クエリで不要なフィールドを除外する基本構文MongoDBでは、find()メソッドの第2引数に射影(プロジェクション)を指定することで、結果から表示したくないフィールドを除外できます。除外したいフィールドには 0 を設定します。以下が基本の構文です。ここでは「yourFieldName1」と「yourFieldName2」という2つのフィールドを除外しています。db.yourCollectionName.find(yourQuery, {yourFieldName1: 0, yourFieldName2: 0});サンプルコレクションの作成実際に動作を確認するため、
-
MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法
MongoDBのAggregationで$matchと$andを使って複数の値を照合する方法 MongoDBで複数の条件の「すべて」に一致するドキュメントを抽出したい場合には、Aggregationパイプラインの$matchステージと$and演算子を組み合わせます。本記事では、ネストされたドキュメント構造を持つコレクションを例に、実際のコードを通して具体的な手順を解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、ネストした構造を持つドキュメントを1件挿入し、テスト用のコレクションを作成します。 > db.demo574.insertOne( .