[MONGODB] $ 슬라이스 연산자를 사용하여 MongoDB의에서 배열의 마지막 요소를 얻을 수 있습니다
MONGODB$ 슬라이스 연산자를 사용하여 MongoDB의에서 배열의 마지막 요소를 얻을 수 있습니다
어떻게하여 MongoDB의 조건 배열의 마지막 요소를 얻을 수 있습니다. 나는 슬라이스를 사용할 수 없습니다입니다. 여기 내 코드입니다
{ "1" : { "relevancy" : [ "Y" ] }, "_id" : ObjectId("530824b95f44eac1068b45c0") }
{ "1" : { "relevancy" : [ "Y", "Y" ] }, "_id" : ObjectId("530824b95f44eac1068b45c2") }
{ "1" : { "relevancy" : [ "N" ] }, "_id" : ObjectId("530824b95f44eac1068b45c3") }
{ "1" : { "relevancy" : [ "Y", "Y" ] }, "_id" : ObjectId("530824b95f44eac1068b45c4") }
{ "1" : { "relevancy" : [ "Y", "N" ] }, "_id" : ObjectId("530824b95f44eac1068b45c6") }
{ "1" : { "relevancy" : [ "N" ] }, "_id" : ObjectId("530824b95f44eac1068b45c7") }
{ "1" : { "relevancy" : [ "Y", "N" ] }, "_id" : ObjectId("530824b95f44eac1068b45c8") }
I 배열 "관련성"의 마지막 요소로서 "Y"를 가지는 행의 수를 카운트 할. 위의 코드에서 그것을 수행하는 방법 3.해야한다. 친절하게 도움을 날.
해결법
-
==============================
1.당신이 지금 알고있는 바와 같이, $ 슬라이스는 시험 결과에 반환 된 배열 요소를 제한하는 투사에 사용됩니다. 당신은 발견에서 결과 프로그램 목록을 처리와 붙어 될 것이다 그래서 ().
당신이 지금 알고있는 바와 같이, $ 슬라이스는 시험 결과에 반환 된 배열 요소를 제한하는 투사에 사용됩니다. 당신은 발견에서 결과 프로그램 목록을 처리와 붙어 될 것이다 그래서 ().
더 나은 방법은 골재 사용하는 것입니다. 그러나 처음의이 $ 슬라이스가 사용되는 방법을 살펴 보자 :
> db.collection.find({},{ relevancy: {$slice: -1} }) { "_id" : ObjectId("530824b95f44eac1068b45c0"), "relevancy" : [ "Y" ] } { "_id" : ObjectId("530824b95f44eac1068b45c2"), "relevancy" : [ "Y" ] } { "_id" : ObjectId("530824b95f44eac1068b45c3"), "relevancy" : [ "N" ] } { "_id" : ObjectId("530824b95f44eac1068b45c4"), "relevancy" : [ "Y" ] } { "_id" : ObjectId("530824b95f44eac1068b45c6"), "relevancy" : [ "N" ] } { "_id" : ObjectId("530824b95f44eac1068b45c7"), "relevancy" : [ "N" ] } { "_id" : ObjectId("530824b95f44eac1068b45c8"), "relevancy" : [ "N" ] }
당신은 마지막 배열 요소를 얻을 수 있지만, 당신은 당신이 마지막 요소 값과 일치 할 수 없기 때문에 결과를 루프에 붙어있다 그래서. 당신은뿐만 아니라 단지 코드에서 이런 짓을했을 수도 있습니다.
이제 집계를 살펴 보자 :
db.collection.aggregate([ // Match things so we get rid of the documents that will never match, but it will // still keep some of course since they are arrays, that *may* contain "N" { "$match": { "relevancy": "Y" } }, // De-normalizes the array { "$unwind": "$relevancy" }, // The order of the array is retained, so just look for the $last by _id { "$group": { "_id": "$_id", "relevancy": { "$last": "$relevancy" } }}, // Match only the records with the results you want { "$match": { "relevancy": "Y" }}, // Oh, and maintain the original _id order [ funny thing about $last ] { "$sort": { "_id": 1 } } ])
이 집계 ()의 첫 번째 사용 될 경우에도, 나는 그것을 배울 것이 좋습니다. 그것은 아마도 가장 유용한 문제 해결 도구입니다. 물론 나를 위해왔다. 당신이 배우는 경우 한 번에 한 번 각 단계를 넣습니다.
또한하지 않도록 문서 양식, 모두가 1 : {...} 하위 문서 표기 실수로 나타납니다하지만 당신은을 지우거나 대신 참조 "1.relevancy"에 위의 코드를 조정해야합니다. 나는 당신의 문서가 실제로 더이 생각처럼 희망 :
{ "relevancy" : [ "Y" ] , "_id" : ObjectId("530824b95f44eac1068b45c0") } { "relevancy" : [ "Y", "Y" ] , "_id" : ObjectId("530824b95f44eac1068b45c2") } { "relevancy" : [ "N" ], "_id" : ObjectId("530824b95f44eac1068b45c3") } { "relevancy" : [ "Y", "Y" ], "_id" : ObjectId("530824b95f44eac1068b45c4") } { "relevancy" : [ "Y", "N" ], "_id" : ObjectId("530824b95f44eac1068b45c6") } { "relevancy" : [ "N" ], "_id" : ObjectId("530824b95f44eac1068b45c7") } { "relevancy" : [ "Y", "N" ], "_id" : ObjectId("530824b95f44eac1068b45c8") }
물론 MongoDB를 3.2을 소개합니다 $ 슬라이스에 대한 "통합"연산자 및 $ 긴장을 풀고 $ 그룹 처리에 대한 필요성을 제거하는 더 나은 $ arrayElemAt 연산자. 당신은 단지 $ 편집하다와 "논리적 일치"를 만들 쿼리 초기 $ 경기 후 :
db.collection.aggregate([ { "$match": { "relevancy": "Y" } }, { "$redact": { "$cond": { "if": { "$eq": [{ "$arrayElemAt": [ "$relevancy", -1 ], "Y" ] }, "then": "$$KEEP", "else": "$$PRUNE" } }} ])
즉, 반환 된 결과에서 문서 $$ KEEP 또는 $$ PRUNE 여부를 결정할 때 배열의 마지막 요소에 검사를 할 것입니다.
당신은 여전히 "투사"를 원하는 경우에 당신은 실제로 $ 슬라이스를 추가 할 수 있습니다 :
db.collection.aggregate([ { "$match": { "relevancy": "Y" } }, { "$redact": { "$cond": { "if": { "$eq": [{ "$arrayElemAt": [ "$relevancy", -1 ], "Y" ] }, "then": "$$KEEP", "else": "$$PRUNE" } }}, { "$project": { "relevancy": { "$slice": [ "$relevancy", -1 ] } } } ])
또는의 다른 방법 :
db.collection.aggregate([ { "$match": { "relevancy": "Y" } }, { "$project": { "relevancy": { "$slice": [ "$relevancy", -1 ] } } }, { "$match": { "relevancy": "Y" } } ])
그러나 먼저 $의 편집하다을하고 "다음"$ 프로젝트`의 모든 재 형성을 할 아마도 적은 비용이다.
from https://stackoverflow.com/questions/21952005/using-slice-operator-to-get-last-element-of-array-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 집계 프레임 워크 :합니까 $ 단체 이용 지수? (0) | 2019.12.12 |
---|---|
[MONGODB] MongoDB를이 - 시간의 시간 범위 사이에 쿼리 (0) | 2019.12.12 |
[MONGODB] ISODate 객체 밀리 초 변환 날짜 (0) | 2019.12.12 |
[MONGODB] 어떻게 필드 이름에 점 사용 하는가? (0) | 2019.12.12 |
[MONGODB] 쿼리 MongoDB를 배열의 첫 번째 항목에서 일치하는 (0) | 2019.12.12 |