sql >> データベース >  >> NoSQL >> MongoDB

MongoDB、MapReduce、および並べ替え

    まず第一に、Mongo map / reduceは(CouchDBのように)クエリツールとして使用するようには設計されていません。バックグラウンドタスクを実行するための設計です。職場で交通データの分析に使用しています。

    ただし、間違っているのは、sort()を入力に適用しているということですが、map()の場合は役に立たないため、 ステージが完了し、中間ドキュメントは各keysで並べ替えられます 。キーはドキュメントであるため、product_idで並べ替えられています 、popularity

    これが私のデータセットを生成した方法です

    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

    これが機能するのは、sorting, product_id, popularityで並べ替えているためです。 。最終的な並べ替えはkeyによるものであることを覚えておいて、好きなように並べ替えを試すことができます。 入力の並べ替え方法に関係なく。

    とにかく、前に言ったように、Map/Reduceでクエリを実行することは避けるべきです。これはバックグラウンド処理用に設計されています。もし私があなたなら、単純なクエリでデータにアクセスできるようにデータを設計するのであれば、この場合、単純なクエリを持つための複雑な挿入/更新には常にトレードオフがあります(これがMongoDBの見方です)。

    >

    1. mongodbのISODateを使用した日付クエリが機能していないようです

    2. Cloudera Impala:Apache Hadoopでのリアルタイムクエリ、実際の場合

    3. Mongodbでドキュメントを更新して返す

    4. ロギングに使用する必要があるNoSQLデータベースはどれですか?