복붙노트

[MONGODB] 계산 조건에 몽고 정렬

MONGODB

계산 조건에 몽고 정렬

나는 모양이를 좋아하는 메시지 몽고의 컬렉션이 있습니다 :

{
  'recipients': [],
  'unRead': [],
  'content': 'Text'
}

수신자는 사용자 ID의 배열이며, 읽지는 아직 메시지를 열지 않은 모든 사용자의 배열입니다. 즉 의도 한대로 일하고,하지만 난처럼, 처음으로 뭔가를 읽지 않은 사람을 우선 순위, 그래서 처음 20 개 결과를 반환하는 모든 메시지의 목록을 조회해야합니다

db.messages.find({recipients: {$elemMatch: userID} })
  .sort({unRead: {$elemMatch: userID}})
  .limit(20)

그러나 그것은 작동하지 않습니다. 그들은 특정 기준에 맞는 여부에 따라 결과의 우선 순위를하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.특정 기준에 따라 "무게"결과를 원하는 또는 "종류"에서 "계산 된 값"어떤 종류가있는 경우에, 당신은 대신 .aggregate () 메소드가 필요합니다. 이것은 문서 만 존재하는 필드를 사용할 수있는, 값이 $의 정렬 작업에 사용되는 "예상"허용 :

    특정 기준에 따라 "무게"결과를 원하는 또는 "종류"에서 "계산 된 값"어떤 종류가있는 경우에, 당신은 대신 .aggregate () 메소드가 필요합니다. 이것은 문서 만 존재하는 필드를 사용할 수있는, 값이 $의 정렬 작업에 사용되는 "예상"허용 :

    db.messages.aggregate([
        { "$match": { "messages": userId } },
        { "$project": {
            "recipients": 1,
            "unread": 1,
            "content": 1,
            "readYet": {
                "$setIsSubset": [ [userId], "$unread" ] }
            }
        }},
        { "$sort": { "readYet": -1 } },
        { "$limit": 20 }
    ])
    

    여기서 $ setIsSubset의 운영자는 일치가 있는지 [userId를]의 변환 배열은 "읽지 않음"배열의 비교를 허용한다. 그렇지 않은 경우 결과는 중 사용자 ID가 존재하는 참 또는 거짓 일 것이다.

    이것은 다음 (일종의 분야별 것은 위에 사실이다)하는 주문 성냥에 우선으로 결과를 정렬 $에 전달 될, 그리고 마지막으로 $ 한계는 지정된 금액에 결과를 반환 할 수 있습니다.

    이에 따라 정렬 할 수 있도록 그래서 "종류"에 대한 계산 된 용어를 사용하기 위해, 값 필요로 문서에 "전망". 집계 프레임 워크는이 작업을 수행하는 방법이다.

    또한 $ elemMatch 그냥 배열 내에서 하나의 값과 일치하도록 필요하지 않습니다, 당신은 직접 값을 지정할 필요가있다. "여러"조건은 물론 여기에 적용되지 않는 하나의 배열 요소에 충족해야 곳의 목적이다.

  2. from https://stackoverflow.com/questions/32958402/mongo-sort-on-a-calculated-condition by cc-by-sa and MIT license