복붙노트

[MONGODB] 집계에 대한 구조 생성

MONGODB

집계에 대한 구조 생성

그래서 여기에 질문입니다. 내가 뭘 원하는 입력 값 집합이 지정된 데이터 구조를 생성합니다.

이것은 여러 언어 제출이기 때문에,의 키 / 값 쌍의 배열로 입력 목록을 살펴 보자. 그러므로 해시,지도, 사전 또는 귀하의 보트를 수레 어떤 용어의 배열. 그 번역하는 보편적 충분히 / 디코드의 희망, JSON 여기에 모든 표기하겠습니다.

그래서 입력, 이제 우리가이 있다고 가정 해 봅시다 :

[ { "4": 10 }, { "7": 9 }, { "90": 7 }, { "1": 8 } ] 

어쩌면 약간의 중복이 있지만, 그와 함께 스틱을 할 수 있습니다.

그 입력으로부터 그래서,이 구조에 도착합니다. 나는 전체 구조를주는거야,하지만 중요한 부분은 "무게"의 값을 반환됩니다 것입니다 :

[
   { "$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
                   ]}
               ]}
           ]}
       ]}
   }}
]

그림과 같이 입력을 사용하여 구조에서와 같이 솔루션 그래서 난으로 채워은 "무게"에 대한 구조 내용을 찾고 있어요.

예 구조의 번호와 같은 모습 숫자와 문자열이 아니라, 그래서 어떤 언어 구현해야하는 값은 JSON 버전은 정확히 같은 찾아야 인코딩.

또는, 나에게 일치하는 USER_ID에 따라 가중치를 할당 동일한 결과를 얻을 수있는 더 나은 방법을 제공합니다.

사람이에 대한 접근 방법이 있습니까?

나는 그냥 구조를 생성 할 수있는 방법을 볼 공정한 생각하는 어떤 언어 구현에 만족하실 것입니다.

나는 나 자신을 추가하려고 하겠지만, 명성은 좋은 구현에 간다.

해피 코딩.

해결법

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

    1.나는 이것에 대해 생각하는 순간 있었을 때, 나는 펄 고향을 실행하고이 아웃을했다 :

    나는 이것에 대해 생각하는 순간 있었을 때, 나는 펄 고향을 실행하고이 아웃을했다 :

    use Modern::Perl;
    
    use Moose::Autobox;
    use JSON;
    
    my $encoder = JSON->new->pretty;
    
    my $input = [ { 4 => 10 }, { 7 => 9 }, { 90 => 7 }, { 1 => 8 } ];
    
    my $stack = [];
    
    foreach my $item ( reverse @{$input} ) {
    
      while ( my ( $key, $value ) = each %{$item} ) {
        my $rec = {
          '$cond' => [
            { '$eq' => [ '$user_id', int($key) ] },
            $value
          ]
        };
    
        if ( $stack->length == 0 ) {
          $rec->{'$cond'}->push( 0 );
        } else {
          my $last = $stack->pop;
          $rec->{'$cond'}->push( $last );
        }
    
        $stack->push( $rec );
      }
    
    }
    
    say $encoder->encode( $stack->[0] );
    

    그래서 과정은 눈부시게 간단했다.

    그래서 필요하지만 중첩 된 출력의 자연 순서를 생산하지 않는 입력의 순서를 반대로으로 나열하는 등의 몇 가지가있다. 테스트 운영자는 간단한 것 같았다 있기 때문에, 그 밖에 "스택"에 대한 내 선택은 배열했다. 그러나 그것은 정말 재 사용, 증강 교체 받고 계속 특이 값입니다.

    또한 JSON 인쇄 출력을 표시하는 단지가있다. 정말 스택의 결과 값입니다 원되는 모든 구조에 병합합니다.

    그럼으로 나는이 중첩 된 구조를 생성하는 방법에 대한 영감을 얻었다 곳에서 OP 사용하는 언어이고, 루비에 대한 논리를 변환 :

    require 'json'
    
    input = [ { 4 => 10 }, { 7 => 9 }, { 90 => 7 }, { 1 => 8 } ]
    
    stack = []
    
    input.reverse_each {|item|
    
      item.each {|key,value|
        rec = {
          '$cond' => [
            { '$eq' => [ '$user_id', key ] },
            value
          ]
        }
    
        if ( stack.length == 0 )
          rec['$cond'].push( 0 )
        else
          last = stack.pop
          rec['$cond'].push( last )
        end
    
        stack.push( rec )
      }
    
    }
    
    puts JSON.pretty_generate(stack[0])
    

    그리고 결국 최종 형태로 영업 이익이 원하는 것을 파이프 라인을 생성합니다 :

    require 'json'
    
    userWeights = [ { 4 => 10 }, { 7 => 9 }, { 90 => 7}, { 1 => 8 } ]
    
    stack = []
    
    userWeights.reverse_each {|item|
    
      item.each {|key,value|
        rec = {
          '$cond' => [
            { '$eq' => [ '$user_id', key ] },
            value
          ]
        }
    
        if ( stack.length == 0 )
          rec['$cond'].push( 0 )
        else
          last = stack.pop
          rec['$cond'].push( last )
        end
    
        stack.push( rec )
      }
    
    }
    
    pipeline = [
        { '$project' => {
            'user_id' => 1,
            'content' => 1,
            'date' => 1,
            'weight' => stack[0]
        }},
        { '$sort' => { 'weight' => -1, 'date' => -1 } }
    ]
    
    puts JSON.pretty_generate( pipeline )
    

    있도록 USER_ID와 컬렉션의 정렬 결과에 고유 한 "무게"를 적용하기 위해 집합으로 전달되는 구조를 생성하는 방법이었다.

  2. ==============================

    2.먼저 나를 위해, 여기에 여러분의 도움이 운동의 위대한 닐을 감사하고 정말 빠릅니다. mongoid 사용하는 분들이 내가 recommended_user_ids 배열입니다 무게 매개 변수를 작성하는 데 사용되는 것입니다 :

    먼저 나를 위해, 여기에 여러분의 도움이 운동의 위대한 닐을 감사하고 정말 빠릅니다. mongoid 사용하는 분들이 내가 recommended_user_ids 배열입니다 무게 매개 변수를 작성하는 데 사용되는 것입니다 :

        def self.project_recommended_weight recommended_user_ids
          return {} unless recommended_user_ids.present?
          {:weight => create_weight_statement(recommended_user_ids.reverse)}
        end
    
        def self.create_weight_statement recommended_user_ids, index=0
          return 0 if index == recommended_user_ids.count
          {"$cond" => [{ "$eq" => ["$user_id", recommended_user_ids[index]] },index+1,create_weight_statement(recommended_user_ids,index+1)]}
        end
    

    파이프 라인이 추가 그래서 단순히이 같은 해시를 병합 :

    {"$project" => {:id => 1,:posted_at => 1}.merge(project_recommended_weight(options[:recommended_user_ids]))}
    
  3. from https://stackoverflow.com/questions/22198172/generating-a-structure-for-aggregation by cc-by-sa and MIT license