0

助けが必要な問題がありますが、身近に感じています。これにはリチウムが含まれ、MongoDBコードは次のようになります:http: //pastium.org/view/0403d3e4f560e3f790b32053c71d0f2b

$db = PopularTags::connection();

        $map = new \MongoCode("function() {
            if (!this.saved_terms) {
                return;
            }

            for (index in this.saved_terms) {
                emit(this.saved_terms[index], 1);
            }
        }");

        $reduce = new \MongoCode("function(previous, current) {
            var count = 0;
            for (index in current) {
                count += current[index];
            }
            return count;
            }");

        $metrics = $db->connection->command(array(
           'mapreduce' => 'users',
           'map' => $map,
           'reduce' => $reduce,
           'out' => 'terms'
       ));

        $cursor = $db->connection->selectCollection($metrics['result'])->find()->limit(1);
        print_r($cursor);
/**
User Data In Mongo

{
 "_id" : ObjectId("4e789f954c734cc95b000012"), 
"email" : "example@bob.com", 
 "saved_terms" : [
    null,

    [
        "technology",
        " apple",
        " iphone"
    ],
    [
        "apple",
        " water",
        " beryy"
    ]
] }


**/

私は彼らが検索するユーザー貯蓄用語を持っています、そしてそれから私は最も人気のある用語を取得しようとします、しかし私はメッセージ'MongoDB :: __construct(invalidname'で:Uncaughtexception'Exception'のようなエラーを受け取り続けます。これまたはいくつかの方向を行う方法は?

4

1 に答える 1

1

まず、これをユーザー オブジェクトに保存しません。MongoDb オブジェクトには、4/16MB の上限があります (バージョンによって異なります)。現在、この制限は通常問題にはなりませんが、1 つのオブジェクトにインラインでログインすると、その制限に達する可能性があります。しかし、より現実的な問題は、これらのオブジェクトを操作する必要があるたびに、それらを RAM にロードする必要があり、消費量が多くなることです。ユーザーオブジェクトでそれが必要だとは思いません。

第二に、オブジェクトの配列はソート可能ではなく、後で戻ってくる可能性のある他の制限があります。

ただし、このようにしたい場合 (検索量が少ないことは実際には問題にならないはずです)、グループ クエリを使用することでこれを最も簡単に解決できます。グループ クエリは、SQL のグループ クエリによく似ているため、ほとんどのオブジェクトが共有するものをグループ化する必要があるため、ちょっとしたトリックです。(おそらくユーザーのアクティブなフィールド)。

したがって、構造に基づいて使用される単語を合計するワーキング グループの例を次に示します。このメソッドをモデルに入れ、MyModel::searchTermUsage() を実行して Document オブジェクトを取得します。

public static function searchTermUsage() {
    $reduce = 'function(obj, prev) {
        obj.terms.forEach(function(terms) {
            terms.forEach(function(term) {
                if (!(term in prev)) prev[term] = 0;
                prev[term]++;
            });
        });
    }';
    return static::all(array(
        'initial' => new \stdclass,
        'reduce' => $reduce,
        'group' => 'common-value-key' // Change this
    ));
}

termsフィールドには配列以外の型に対する保護はありません(例では null 値がありました)。簡単にするために削除しましたが、データベースに保存される前に削除することをお勧めします。

于 2011-09-25T13:30:41.880 に答える