복붙노트

[MONGODB] 몽고는 : 어떻게 외부 중량 정렬하려면

MONGODB

몽고는 : 어떻게 외부 중량 정렬하려면

@NeilLunn 정상적으로 응답 한이 질문에 따라, 여기에 더 자세히 내 문제입니다.

이것은 일부는 일부는하지 않습니다 USER_ID 한 문서의 집합입니다. 문서를 생성 한 사용자를 나타냅니다 USER_ID :

{ "user_id" : 11, "content" : "black", "date": somedate }
{ "user_id" : 6, "content" : "blue", "date": somedate }
{ "user_id" : 3, "content" : "red", "date": somedate }
{ "user_id" : 4, "content" : "black", "date": somedate }
{ "user_id" : 4, "content" : "blue", "date": somedate }
{ "user_id" : 90, "content" : "red", "date": somedate }
{ "user_id" : 7, "content" : "orange", "date": somedate }
{ "content" : "orange", "date": somedate }
{ "content" : "red", "date": somedate }
...
{ "user_id" : 4, "content" : "orange", "date": somedate }
{ "user_id" : 1, "content" : "orange", "date": somedate }
{ "content" : "red", "date": somedate }
{ "user_id" : 90, "content" : "purple", "date": somedate }

각 페이지에 10 개해야합니다 내가 한도 그렇게하고 건너 뛸 수 있도록 프런트 엔드, 페이지를 당겨 그리고 그것은 매우 잘 작동한다.

경우에 우리는 사용자가 로그인 한, 나는 현재 그가 상호 작용 사용자를 기반으로, 그가 처음 더 흥미 찾을 수 있습니다 사용자 문서에 기록에 표시하고 싶습니다.

현재 사용자가 흥미 찾을 수 있습니다 사용자의 목록은 별 정렬되고, 몽고의 외부에 위치하고 있습니다. 첫 번째 요소는 내가 먼저 그의 서류를 제시하고자하는 가장 중요한 사용자이며, 목록의 마지막 사용자는 중요한 이상입니다 그래서.

목록은 다음과 같습니다 간단한 배열입니다 : [4,7,90,1].

이 사용자의 점수를 생성 시스템은 몽고에 위치하지 않은,하지만 난 그 의지 도움말 경우 데이터를 복사 할 수 있습니다. 또한 점수 번호를 포함하는 배열을 변경할 수 있습니다.

내가 달성하고자하는 것은 다음과 같다 :

, USER_ID 4에서 문서를 표시하는 첫번째 것 그래서, 문서가 목록에서 USER_ID의 중요성으로 분류 받기 USER_ID 칠초에서 문서 등등. 목록에 남아있는 사용자가없는 경우 언제 문서의 나머지 부분을 보여 드리고자합니다. 이 같이 :

이걸 어떻게 수행해야합니까? 나는 너무 많은 몽고에서 요구하는 건가요?

해결법

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

    1.배열을 감안할 [4,7,90,1]는 당신이 당신의 쿼리에서 원하는 것은 이것이다 :

    배열을 감안할 [4,7,90,1]는 당신이 당신의 쿼리에서 원하는 것은 이것이다 :

    db.collection.aggregate([
       { "$project": {
           "user_id": 1,
           "content": 1,
           "date": 1,
           "weight": { "$or": [
               { "$eq": ["$user_id": 4] }, 
               { "$eq": ["$user_id": 7] }, 
               { "$eq": ["$user_id": 90] }, 
               { "$eq": ["$user_id": 1] }, 
           ]}
       }},
       { "$sort": { "weight": -1, "date": -1 } }
    ])
    

    모든 항목이 $ 또는 조건에 포함을 위해 그렇게 그 무엇,의 USER_ID 필드는 참 또는 거짓을 위해 1 또는 0을 제공된 값에 대해 테스트, 및 $ EQ 반환됩니다.

    당신이 코드에서 어떻게하면 $의 배열 상태를 구축 배열에 당신이 각 항목입니다. 각 조건에 해당 것이 그냥 배열에 전달 및 연결, 해시 구조를 만드는, 그래서에서 $ 또는 조건의 배열 값으로.

    이 부분이 명확했을 것이다, 그래서 아마 이전 코드 밖으로 $ 콘드 연산자를 떠난한다.

    여기에 루비 뇌에 대한 몇 가지 코드는 :

    userList = [4, 7, 90, 1];
    
    orCond = [];
    
    userList.each do |userId|
      orCond.push({ '$eq' => [ 'user_id', userId ] })
    end
    
    pipeline = [
        { '$project' => {
            'user_id' => 1,
            'content' => 1,
            'date' => 1,
            'weight' => { '$or' => orCond }
        }},
        { '$sort' => { 'weight' => -1, 'date' => -1 } }
    ]
    

    개별 가중치를 갖고 싶어 우리는 키 값 쌍을 가정합니다 경우에, 당신은 $ 콘드 둥지에 필요

    db.collection.aggregate([
       { "$project": {
           "user_id": 1,
           "content": 1,
           "date": 1,
           "weight": { "$cond": [
               { "$eq": ["$user_id": 4] },
               10,
               { "$cond": [ 
                   { "$eq": ["$user_id": 7] },
                   9,
                   { "$cond": [
                       { "$eq": ["$user_id": 90] },
                       7,
                       { "$cond": [
                           { "$eq": ["$user_id": 1] },
                           8, 
                           0
                       ]}
                   ]}
               ]}
           ]}
       }},
       { "$sort": { "weight": -1, "date": -1 } }
    ])
    

    그냥 반환 값의 것을 참고,이 순서에있을 필요는 없습니다. 그리고 당신은 그것의 생성에 대해 생각할 수 있습니다.

    이 구조를 생성하기 위해 여기에 참조 :

    https://stackoverflow.com/a/22213246/2313887

  2. from https://stackoverflow.com/questions/22192098/mongo-how-to-sort-by-external-weight by cc-by-sa and MIT license