복붙노트

[MONGODB] MongoDB를, 맵리 듀스 및 정렬

MONGODB

MongoDB를, 맵리 듀스 및 정렬

난 아직 여기 간다 MongoDB를의 기능과 아웃을 배우고, 그러나있어 나는이 내 머리에 약간 수 있습니다.

지금 나는 ID로 그룹 다음을 일종의 그것은 임의의 데이터 포인트 (예. 인기)에 의해, 데이터 세트를 통해 / 검색 도구에 필터를 작업하고 있어요. 나는이 작업을 수행 할 수 있습니다 볼 수있는 유일한 방법은 몽고의 맵리 듀스 기능을 통해입니다.

나는 10,000 개 이상의 키와 함께 일하고 있어요 나는 또한 데이터 집합을 정렬 할 수 있어야하기 때문에 () .group 사용할 수 없습니다.

내 맵리 듀스 코드는 한 가지를 제외하고 잘 작동 : 정렬. 단지 정렬하는 것은 전혀 일을하지 않습니다.

db.runCommand({
  'mapreduce': 'products',
  'map': function() {
    emit({
      product_id: this.product_id,
      popularity: this.popularity
    }, 1);
  },
  'reduce': function(key, values) {
    var sum = 0;
    values.forEach(function(v) {
      sum += v;
    });

    return sum;  
  },
  'query': {category_id: 20},
  'out': {inline: 1},
  'sort': {popularity: -1}
});

나는 이미 확실히 그 때문에 부족으로 작동하지 않는, 그래서 인기가 데이터 포인트에 내림차순 인덱스가 :

{ "v" : 1, "key" : { "popularity" : -1 }, "ns" : "app.products", "name" : "popularity_-1" }

그것은 정렬하지 않는 이유를 난 그냥 알아낼 수 없습니다.

대신 결과 집합을 인라인, 나는 다른 컬렉션에 출력을 할 수 없습니다 다음 .find () 종류 ({인기 : -1})를 실행하는 방식이 기능은 작업에 가기 때문에이..

해결법

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

    1.우선, 몽고지도 / (이 CouchDB를에서와 같이) 쿼리 도구로 사용하도록 설계되지 줄일, 당신이 백그라운드 작업을 실행하기위한 디자인이다. 나는 트래픽 데이터를 분석하는 일에 그것을 사용할 수 있습니다.

    우선, 몽고지도 / (이 CouchDB를에서와 같이) 쿼리 도구로 사용하도록 설계되지 줄일, 당신이 백그라운드 작업을 실행하기위한 디자인이다. 나는 트래픽 데이터를 분석하는 일에 그것을 사용할 수 있습니다.

    당신이 그러나 잘못을하고있는 것은 당신이 당신의 입력에 정렬 ()를 적용하고 있다는이지만,지도 () 단계가 완료되면 중간 문서는 각각의 키으로 분류되어 있기 때문에 쓸모가 없다. 키가 문서이기 때문에, PRODUCT_ID, 인기에 의해 분류되고 있습니다.

    이것은 내가 내 데이터 세트를 생성하는 방법이다

    function generate_dummy_data() {
        for (i=2; i < 1000000; i++) { 
            db.foobar.save({
              _id: i, 
             category_id: parseInt(Math.random() * 30), 
             popularity:    parseInt(Math.random() * 50)
            }) 
        }
    }
    

    그리고이 내지도 / 작업을 줄일 수 :

    var data = db.runCommand({
      'mapreduce': 'foobar',
      'map': function() {
        emit({
          sorting: this.popularity * -1,
          product_id: this._id,
          popularity: this.popularity,
        }, 1);
      },
      'reduce': function(key, values) {
        var sum = 0;
        values.forEach(function(v) {
          sum += v;
        });
    
        return sum;  
      },
      'query': {category_id: 20},
      'out': {inline: 1},
    });
    

    그리고 이것은 최종 결과 (매우 긴 여기에 붙여 넣으려면)입니다 :

    http://cesarodas.com/results.txt

    지금 우리가 정렬하여 정렬하고 있기 때문에이 작품은 인기를 PRODUCT_ID. 당신은 당신이 당신의 입력을 정렬하는 방법을 최종 분류는 관계없이 키가 있다는 사실을 좋아하는 방법 적 분류와 함께 재생할 수 있습니다.

    난 당신이지도와 함께 쿼리를 수행하지 않도록해야합니다 전에 말했다 어쨌든로 /이 백그라운드 처리를 위해 설계되었습니다 줄일 수 있습니다. 내가 당신이라면 나는 간단한 쿼리로 액세스 할 수있는 방식으로 내 데이터를 설계하는 것, 항상 절충이 경우 복잡한 삽입에있다 / 업데이트는 간단한 쿼리를하는 (내가 MongoDB를 참조하는 방법의 그).

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

    2.원래의 질문에 대한 논의에서 언급 한 바와 같이 :

    원래의 질문에 대한 논의에서 언급 한 바와 같이 :

    여기에 원래의지도와 유사한 쿼리의 예 / 축소, 대신 집계 프레임 워크를 사용하여 :

    db.products.aggregate(
      { $match: { category_id: 20 }},
      { $group : {
         _id : "$product_id",
         'popularity' : { $sum : "$popularity" },
      }},
      { $sort: { 'popularity': -1 }}
    )
    

    .. 샘플 출력 :

    {
        "result" : [
            {
                "_id" : 50,
                "popularity" : 139
            },
            {
                "_id" : 150,
                "popularity" : 99
            },
            {
                "_id" : 123,
                "popularity" : 55
            }
        ],
        "ok" : 1
    }
    
  3. from https://stackoverflow.com/questions/12015064/mongodb-mapreduce-and-sorting by cc-by-sa and MIT license