[MONGODB] 각 그룹에 대해 마지막으로 "true"로 값을 반환
MONGODB각 그룹에 대해 마지막으로 "true"로 값을 반환
나는 문서처럼하는 컬렉션이 있습니다 :
{
_id: ObjectId(),
user: ObjectId(),
studentName: String,
createdAt: Date,
isAbondoned: boolean
}
문서의 예는 다음과 같습니다
1-
{
"_id" : ObjectId("56cd2d36a489a5b875902f0e"),
"user" : ObjectId("56c4cafabd5f92cd78ae49d4"),
"studentName" : "Aman",
"createdAt" : ISODate("2016-02-24T04:10:30.486+0000"),
"isAbandoned" : true
}
2-
{
"_id" : ObjectId("56cd2dcda489a5b875902fcd"),
"user" : ObjectId("56c4cafabd5f92cd78ae49d4"),
"studentName" : "Aman",
"createdAt" : ISODate("2016-02-24T04:13:01.932+0000"),
"isAbandoned" : false
}
3-
{
"_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev",
"createdAt" : ISODate("2016-02-25T11:27:17.281+0000"),
"isAbandoned" : true,
}
지금은 자신의 'isAbandoned'는 마지막 'createdAt'문서에 대한 true 인 학생들의 목록을 찾고 싶어요.
위의 예에서 요구되는 출력은 :
{
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev"
}
studentName은 "아만"최대 (createdAt)이 2 문서이며, 'isAbandoned'때문에 대한 false입니다.
해결법
-
==============================
1.이 작업을 수행하는 가장 좋은 방법은 통합 프레임 워크를 사용하고 있습니다. 당신은 "사용자"가 $ 그룹에 문서를 필요로하고 $ 마지막 누적 연산자를 사용하여 각 사용자에 대해 마지막 문서를 반환하지만,이 작업을 수행하려면, 당신은 $ 정렬 집계 파이프 라인 연산자를 사용하여 예비 정렬 단계가 필요합니다. 문서를 정렬하려면, 당신은 "createdAt"필드와 "사용자"필드를 모두 고려해야합니다.
이 작업을 수행하는 가장 좋은 방법은 통합 프레임 워크를 사용하고 있습니다. 당신은 "사용자"가 $ 그룹에 문서를 필요로하고 $ 마지막 누적 연산자를 사용하여 각 사용자에 대해 마지막 문서를 반환하지만,이 작업을 수행하려면, 당신은 $ 정렬 집계 파이프 라인 연산자를 사용하여 예비 정렬 단계가 필요합니다. 문서를 정렬하려면, 당신은 "createdAt"필드와 "사용자"필드를 모두 고려해야합니다.
파이프 라인의 마지막 단계는 당신이 진정한 같다 "isAbandoned"만 마지막 문서를 선택하고 $ 일치하는 단계입니다.
db.students.aggregate([ { "$sort": { "user": 1, "createdAt": 1 } }, { "$group": { "_id": "$user", "last": { "$last": "$$ROOT" } }}, { "$match": { "last.isAbandoned": true } } ])
이는 다음과 같이 뭔가를 반환합니다 :
{ "_id" : ObjectId("56c85244bd5f92cd78ae4bc1"), "last" : { "_id" : ObjectId("56cee51503b7cb7b0eda9c4c"), "user" : ObjectId("56c85244bd5f92cd78ae4bc1"), "studentName" : "Rajeev", "createdAt" : ISODate("2016-02-25T11:27:17.281Z"), "isAbandoned" : true } }
예상 된 결과를 얻으려면, 우리는 정상 수준으로 포함 된 문서를 촉진하기 위해 혼란 스럽다 3.4에서 시작 $의 replaceRoot 파이프 라인 연산자를 사용합니다
{ $replaceRoot: { newRoot: "$last" } }
이전 버전에서는, 당신은 우리의 문서 모양을 변경하기 위해 $ 프로젝트 집계 파이프 라인 작업을 사용합니다. 우리는 다음 단계로 우리의 파이프 라인을 확장 그래서 경우 :
{ "$project": { "_id": "$last._id", "user": "$last.user", "studentName": "$last.studentName", "createdAt": "$last.createdAt", "isAbandoned": "$last.isAbandoned" }}
그것은 예상 출력을 생성합니다 :
{ "_id" : ObjectId("56cee51503b7cb7b0eda9c4c"), "user" : ObjectId("56c85244bd5f92cd78ae4bc1"), "studentName" : "Rajeev", "createdAt" : ISODate("2016-02-25T11:27:17.281Z"), "isAbandoned" : true }
-
==============================
2.이것은 특정 필드 (createdAt)에 의해 그룹 데이터에 대한 필요성의 좋은 예 후 비교 결과 세트 일치 기준입니다.
이것은 특정 필드 (createdAt)에 의해 그룹 데이터에 대한 필요성의 좋은 예 후 비교 결과 세트 일치 기준입니다.
암호:
db.student.aggregate([{ $group : { _id : "$user", created : { $max : "$createdAt" }, documents : { $push : "$$ROOT" } } }, { $project : { _id : 0, documents : { $filter : { input : "$documents", as : "item", cond : { $eq : ["$$item.createdAt", "$created"] } } }} }, { $match : { "documents.isAbandoned" : true }}, { $unwind : "$documents" }, { $project : { _id : "$documents._id", user : "$documents.user", studentName : "$documents.studentName", createdAt : "$documents.createdAt", isAbandoned : "$documents.isAbandoned", }} ])
from https://stackoverflow.com/questions/37258334/return-the-last-true-value-for-each-group by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 어떻게 ++하여 MongoDB의 드라이버를 C를 사용하여 프로그램을 구축 할 수 있습니다? (0) | 2019.12.20 |
---|---|
[MONGODB] MongoDB의에서 현지 시간대와 날짜 별 그룹 (0) | 2019.12.20 |
[MONGODB] MongoDB를 GET _id 찾기 쿼리 문자열로 (0) | 2019.12.20 |
[MONGODB] 날짜 별 자바 / MongoDB의 쿼리 (0) | 2019.12.20 |
[MONGODB] 어떻게하여 MongoDB에서 필드를 증가 하는가? (0) | 2019.12.20 |