복붙노트

[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. ==============================

    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. ==============================

    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",
     }}
    ])
    
  3. from https://stackoverflow.com/questions/37258334/return-the-last-true-value-for-each-group by cc-by-sa and MIT license