정의
구문
$first 의 구문은 다음과 같습니다:
{ $first: <expression> } 
<expression> 는 null 또는 누락된 배열로 해석되는 한 모든 유효한 표현식 일 수 있습니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 .
$first 연산자 는 다음 $arrayElemAt 표현식 의 별칭입니다.
{ $arrayElemAt: [ <array expression>, 0 ] } 
행동
유효한 피연산자
$first 의 유효한 피연산자는 배열, null 또는 누락된 것으로 해석되어야 합니다.
- 피연산자가 비어 있지 않은 배열 로 해석되는 경우 - $first은 배열 의 첫 번째 요소를 반환합니다.
- 피연산자가 빈 배열 - []로 해석되는 경우- $first는 값을 반환하지 않습니다.
- 피연산자가 null이거나 누락된 경우 - $first은 null을 반환합니다.
예를 들어, 다음 문서를 사용하여 테스트 collection 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 또는 누락으로 해석되지 않으면 애그리게이션 연산 전체에 오류가 발생합니다.
예를 들어, 다음 문서를 사용하여 테스트 collection 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 : 
예시
다음 문서를 사용하여 샘플 collection 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 배열에 요소가 두 개 이상 있는 경우 두 거리:
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 을 사용할 수 있습니다.