Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

db.collection.findOne()

項目一覧

  • 定義
  • 互換性
  • 構文
  • 動作
db.collection.findOne(query, projection, options)

重要

mongosh メソッド

このページでは、mongosh メソッドについて記載しています。ただし、データベースコマンドや Node.js などの言語固有のドライバーのドキュメントには該当しません

データベースコマンドについては、 findコマンドを参照してください。

MongoDB API ドライバーについては、各言語の MongoDB ドライバー ドキュメントを参照してください。

コレクションまたはビューで指定されたクエリ条件を満たす 1 つのドキュメントを返します。

返されるドキュメントは、クエリ条件に一致するドキュメントの数と、使用するクエリプランによって異なる場合があります。

一致するドキュメントの数
クエリプラン
結果

0

Any

このメソッドが返すのは null

1

Any

メソッドは、指定されたクエリ条件を満たすドキュメントを返します。

2以上

コレクションスキャン

このメソッドは、自然な順序に従って最初のドキュメントを返します。上限付きコレクションにおける自然な順序は、挿入順序と同じです。

2以上

インデックス スキャン

このメソッドは、インデックスから検索された最初のドキュメントを返します。

重要

クエリプランが別のインデックスを使用するように変更された場合、このメソッドは別のドキュメントを返すことがあります。ユースケースで特定のレコードを一貫して選択する必要がある場合は、options ドキュメントを使用してソートを指定する必要があります。options ドキュメントで findOne() を使用する方法の詳細については、を参照してください。

projection パラメーターを指定すると、findOne()projection フィールドのみを含むドキュメントを返します。_id フィールドは明示的に除外されない限り、常に含まれます。

注意

find()メソッドと似ていますが、 findOne()メソッドはカーソルではなくドキュメントを返します。

このメソッドは、次の環境でホストされている配置で使用できます。

  • MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです

注意

このコマンドは、すべての MongoDB Atlas クラスターでサポートされています。すべてのコマンドに対する Atlas のサポートについては、「サポートされていないコマンド」を参照してください。

  • MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン

  • MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン

findOne() メソッドの形式は次のとおりです。

db.collection.findOne( <query>, <projection>, <options> )

findOne() メソッドは次のパラメーターを取ります。

Parameter
タイプ
説明

query

ドキュメント

任意。クエリ演算子を使用してクエリの選択条件を指定します。

projection

ドキュメント

任意。プロジェクション演算子 を使用して返すフィールドを指定します。このパラメーターを省略すると、一致するドキュメント内のすべてのフィールドが返されます。詳細については、「 プロジェクション 」を参照してください。

options

ドキュメント

任意。クエリの追加オプションを指定します。これらのによりクエリ動作と結果が返される方法が変更されます。利用可能なオプションを確認するには、「FindOptions を参照してください。

MongoDB 4.2以降では、 db.collection.findOne()を発行したクライアントが操作の完了前に切断した場合、MongoDB は killOp を使用してdb.collection.findOne()を終了対象としてマークし

重要

言語の整合性

find()findAndModify() プロジェクションを集計の $project ステージと一貫性を持たせるために、次の条件が課されます。

projection パラメーターにより、一致するドキュメントで返されるフィールドが決定されます。projection パラメーターは以下の形式のドキュメントです。

{ field1: <value>, field2: <value> ... }
プロジェクション
説明

<field>: <1 or true>

フィールドを包含することを指定します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を true として処理します。

<field>: <0 or false>

フィールドの除外を指定します。

"<field>.$": <1 or true>

$ 配列プロジェクション 演算子を使用して、配列フィールドのクエリ条件に一致する最初の要素を返します。プロジェクションの値としてゼロ以外の整数を指定した場合、その値を true として処理します。

ビューには使用できません。

<field>: <array projection>

配列プロジェクション 演算子($elemMatch$slice)を使用して、含める配列要素を指定します。

ビューには使用できません。

<field>: <$meta expression>

$meta 演算子式を使用して、使用可能な per-document metadataを含めることを指定します。

ビューには使用できません。

<field>: <aggregation expression>

プロジェクションを行ったフィールドの値を指定します。

集計式と構文の使用(リテラルと集計変数の使用を含む)では、新しいフィールドをプロジェクションしたり、既存のフィールドを新しい値でプロジェクションしたりできます。

  • プロジェクションの値として数値でもブール値でもないリテラル(例えば、文字列リテラルや配列、演算子式)を指定すると、フィールドは新しい値でプロジェクションされます。次に例を示します。

    • { field: [ 1, 2, 3, "$someExistingField" ] }

    • { field: "New String Value" }

    • { field: { status: "Active", total: { $sum: "$existingArray" } } }

  • フィールドにリテラル値をプロジェクションするには、$literal 集計式を使用します。次に例を示します。

    • { field: { $literal: 5 } }

    • { field: { $literal: true } }

    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }

埋め込みドキュメント内のフィールドの場合は、次のいずれかを使用してフィールドを指定できます。

  • ドット表記の場合は次のようになります。 "field.nestedfield": <value>

  • ネストされた形式の例 { field: { nestedfield: <value> } }

_id フィールドは、プロジェクションで _id: 0 を明示的に指定して抑制しない限り、返されるドキュメントにデフォルトで含まれます。

projection には、 _id フィールドを除いて、包含指定と除外指定の両方を含めることはできません。

  • フィールドを明示的に含めるプロジェクションでは、_id フィールドだけが明示的に除外できる唯一のフィールドです。

  • フィールドを明示的に除外するプロジェクションでは、_id フィールドが明示的に包含できる唯一のフィールドですが、デフォルトで _id フィールドが含まれます。

プロジェクションの詳細については、以下も参照してください。

次の操作は、bios コレクションから単一ドキュメントを返します。

db.bios.findOne()

次の操作を実行すると、次のいずれかの条件に最初に一定するドキュメントがbios コレクションから返されます。埋め込みドキュメントnameのフィールドfirstが文字Gで始まる、またはフィールドbirthnew Date('01/01/1945')より小さい。

db.bios.findOne(
{
$or: [
{ 'name.first' : /^G/ },
{ birth: { $lt: new Date('01/01/1945') } }
]
}
)

projection は返すフィールドを指定するパラメーターです。このパラメーターに含まれるのは、包含指定と除外指定のいずれかであり、除外指定の対象が _id フィールドでない限り、両方を指定することはできません。

次の操作を実行すると、 bios コレクション内のドキュメントが検索され、 namecontribs_idフィールドのみが返されます。

db.bios.findOne(
{ },
{ name: 1, contribs: 1 }
)

次の操作を実行すると、 contribsフィールドに要素OOPが含まれるbios コレクション内のドキュメント、および_idフィールドname埋め込みドキュメント内のfirstフィールド、およびbirthフィールド:

db.bios.findOne(
{ contribs: 'OOP' },
{ _id: 0, 'name.first': 0, birth: 0 }
)

次の操作では、sort オプションを使用して、ソートされた bios コレクションから最初に一致するドキュメントを返します。この例では、コレクションは birth の昇順でソートされています。

db.bios.findOne(
{ },
{ },
{ sort: { birth: 1 } }
)

単一ドキュメントが返されるため、カーソル メソッドは findOne() の結果に適用できません。次のとおり、ドキュメントに直接アクセスできます。

var myDocument = db.bios.findOne();
if (myDocument) {
var myName = myDocument.name;
print (tojson(myName));
}

クエリオプションを指定してクエリの動作を変更することで、結果が返される方法を指定できます。

たとえば、 findOne メソッド内の他の場所からアクセスできる変数を定義するには、 let オプションを使用します。変数を使用して結果をフィルターするには、$expr 演算子内で変数にアクセスする必要があります。

コレクション cakeFlavors を以下ように作成します。

db.cakeFlavors.insertMany( [
{ _id: 1, flavor: "chocolate" },
{ _id: 2, flavor: "strawberry" },
{ _id: 3, flavor: "cherry" }
] )

次の例では、lettargetFlavor 変数を定義し、その変数を使用してチョコレート ケーキの風味を検索します。

db.cakeFlavors.findOne(
{ $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
{ _id: 0 },
{ let : { targetFlavor: "chocolate" }
} )

出力:

{ flavor: 'chocolate' }

利用可能なすべてのクエリ オプションを確認するには、「FindOptions」を参照してください。

戻る

db.collection.findAndModify