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

$first(配列演算子)

項目一覧

  • 定義
  • 構文
  • 動作
  • 詳細
$first

バージョン 4.4 で追加

配列内の最初の要素を返します。

注意

曖昧さ回避

このページでは、$first 配列演算子について説明します。$first 集計アキュムレータについては、$first (aggregation accumulator) を参照してください。

Tip

以下も参照してください。

$first の構文は次のとおりです。

{ $first: <expression> }

<expression>は、配列、null、または欠落している配列に変換される限り、任意の有効なにすることができます。 式の詳細については、「式 」を参照してください。

$first演算子は、次の$arrayElemAt式のエイリアスです。

{ $arrayElemAt: [ <array expression>, 0 ] }

$firstの有効なオペランドは、配列、null、または欠落している必要があります

  • オペランドが空でない配列に解決されると、 $firstは配列の最初の要素を返します。

  • オペランドが空の配列[]に解決される場合、 $firstは値を返しません。

  • オペランドが null または欠落している場合、 $firstは null を返します。

たとえば、次のドキュメントを含むテスト コレクションexample1を作成します。

db.example1.insertMany([
{ "_id" : 1, "x" : [ 1, 2, 3 ] }, // Non-empty array
{ "_id" : 2, "x" : [ [ ] ] }, // Non-empty array
{ "_id" : 3, "x" : [ null ] }, // Non-empty array
{ "_id" : 4, "x" : [ ] }, // Empty array
{ "_id" : 5, "x" : null }, // Is null
{ "_id" : 6 } // Is Missing
])

次に、次の例では、 $first演算子をxフィールドに適用した結果生成される新しいフィールドfirstElemを追加します。

db.example1.aggregate([
{ $addFields: { firstElem: { $first: "$x" } } }
])

この演算子は、次のドキュメントを返します。

{ "_id" : 1, "x" : [ 1, 2, 3 ], "firstElem" : 1 }
{ "_id" : 2, "x" : [ [ ] ], "firstElem" : [ ] }
{ "_id" : 3, "x" : [ null ], "firstElem" : null }
{ "_id" : 4, "x" : [ ] } // No output
{ "_id" : 5, "x" : null, "firstElem" : null }
{ "_id" : 6, "firstElem" : null }

オペランドが配列、null、または欠落している場合、集計操作全体がエラーになります。

たとえば、次のドキュメントを含むテスト コレクションexample2を作成します。

db.example2.insertMany([
{ "_id" : 1, "x" : [ 1, 2, 3 ] },
{ "_id" : 2, "x" : 2 }, // x is not an array/null or missing
])

次に、 { "_id" : 2, "x" : 2 }ドキュメントが原因で次の集計操作ではエラーが返されます。

db.example2.aggregate( { $addFields: { firstElem: { $first: "$x" } } } )

つまり、この操作は次の結果を返します。

2020-01-20T18:31:13.431-05:00 E QUERY [js] uncaught exception: Error: command failed: {
"ok" : 0,
"errmsg" : "$first's argument must be an array, but is double",
"code" : 28689,
"codeName" : "Location28689"
} : aggregate failed :

次のドキュメントを含む runninglog のサンプル コレクションを作成します。

db.runninglog.insertMany([
{ "_id" : 1, "team" : "Anteater", log: [ { run: 1, distance: 8 }, { run2: 2, distance: 7.5 }, { run: 3, distance: 9.2 } ] },
{ "_id" : 2, "team" : "Bears", log: [ { run: 1, distance: 18 }, { run2: 2, distance: 17 }, { run: 3, distance: 16 } ] },
{ "_id" : 3, "team" : "Cobras", log: [ { run: 1, distance: 2 } ] }
])

次の集計では、 log配列に対して$first } 演算子と$last演算子を使用して、最初の実行と最後の実行の情報を検索します。

db.runninglog.aggregate([
{ $addFields: { firstrun: { $first: "$log" }, lastrun: { $last: "$log" } } }
])

この操作は次の結果を返します。

{ "_id" : 1, "team" : "Anteater", "log" : [ { "run" : 1, "distance" : 8 }, { "run2" : 2, "distance" : 7.5 }, { "run" : 3, "distance" : 9.2 } ],
"firstrun" : { "run" : 1, "distance" : 8 }, "lastrun" : { "run" : 3, "distance" : 9.2 } }
{ "_id" : 2, "team" : "Bears", "log" : [ { "run" : 1, "distance" : 18 }, { "run2" : 2, "distance" : 17 }, { "run" : 3, "distance" : 16 } ],
"firstrun" : { "run" : 1, "distance" : 18 }, "lastrun" : { "run" : 3, "distance" : 16 } }
{ "_id" : 3, "team" : "Cobras", "log" : [ { "run" : 1, "distance" : 2 } ],
"firstrun" : { "run" : 1, "distance" : 2 }, "lastrun" : { "run" : 1, "distance" : 2 } }

最初と最後の距離の変化を計算するために、次の操作では$cond } 演算子と$size演算子を使用して差を計算します( $subtractは、 log配列に 2 つ以上の要素がある場合、2 つの距離を除外します。

db.runninglog.aggregate([
{ $addFields: { firstrun: { $first: "$log" }, lastrun: { $last: "$log" } } },
{ $project: { team: 1, progress:
{
$cond: {
if: { $gt: [ { $size:"$log" }, 1 ] } ,
then: { $subtract: [ "$lastrun.distance", "$firstrun.distance"] },
else: "Not enough data." }
}
}}
])

この操作により、次のドキュメントが返されます。

{ "_id" : 1, "team" : "Anteater", "progress" : 1.1999999999999993 }
{ "_id" : 2, "team" : "Bears", "progress" : -2 }
{ "_id" : 3, "team" : "Cobras", "progress" : "Not enough data." }

デフォルトでは、 mongoshは数値に対して64ビットの浮動小数点 double を使用します。 精度を向上させるには、代わりにNumberDecimalを使用します。

戻る

$first