마지막(배열 연산자)
정의
$last
버전 4.4에 추가되었습니다.
배열의 마지막 요소를 반환합니다.
참고
명확화
이
$last
페이지에서는 배열 연산자 에 대해 설명합니다.$last
$last (aggregation accumulator)
집계 축적자 에 대해서는 을(를) 참조하세요.
구문
$last
연산자의 구문은 다음과 같습니다.
{ $last: <expression> }
<expression>
는 배열, null 또는 누락으로 해석되는 한 모든 유효한 표현식 일 수 있습니다. 표현식에 대한 자세한 내용은 표현식을 참조하세요 .
$last
연산자 는 다음 $arrayElemAt
표현식 의 별칭입니다.
{ $arrayElemAt: [ <array expression>, -1 ] }
행동
유효한 피연산자
$last
의 유효한 피연산자는 배열, null 또는 누락된 것으로 해석되어야 합니다.
피연산자가 비어 있지 않은 배열 로 해석되는 경우
$last
은 배열 의 마지막 요소를 반환합니다.피연산자가 빈 배열
[]
로 해석되는 경우$last
는 값을 반환하지 않습니다.피연산자가 null이거나 누락된 경우
$last
은 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 ])
그런 다음 $last
연산자 를 x
필드 에 적용하여 값이 파생된 새 필드 lastElem
를 추가합니다.
db.example1.aggregate([ { $addFields: { lastElem: { $last: "$x" } } } ])
연산자는 다음 문서를 반환합니다.
{ "_id" : 1, "x" : [ 1, 2, 3 ], "lastElem" : 3 } { "_id" : 2, "x" : [ [ ] ], "lastElem" : [ ] } { "_id" : 3, "x" : [ null ], "lastElem" : null } { "_id" : 4, "x" : [ ] } // No output { "_id" : 5, "x" : null, "lastElem" : null } { "_id" : 6, "lastElem" : 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: { lastElem: { $last: "$x" } } } )
즉, 이 연산은 다음을 반환합니다.
2020-01-20T21:12:26.713-05:00 E QUERY [js] uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$last'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 을 사용할 수 있습니다.