1

私はSQLでこのクエリを持っています:

"SELECT code, name, count(*) FROM table WHERE customer = "XXX" GROUP BY code ORDER BY count(*) DESC;

私は PHP を使用しており、この SQL クエリを mongodb に変換する必要があります。私はmongodbでカウントするために次のようなことをしなければならないことを知っています:

$array_where_condition = array("customer" => "XXX");
$db->find($array_where_condition)->count();

しかし、上記のようなクエリの書き方がわかりません。

4

3 に答える 3

3

そのようなクエリに map reduce を使用しようとしている場合は、すでに間違っています。

この場合、MR は SQL 集計フレームワークの優れた代替品にはならず、独自のアプリケーションに対してリアルタイムでインラインで実行されません。

ただし、集約フレームワークを使用することはできます。これにより、探しているパフォーマンスが得られる場合があります。私は集計フレームワークに少し慣れていませんが、これは簡単に書かれていますが、これは必要なものに近いものかもしれません:

db.col.aggregate(
    {$match: {customer: XXX}}, 
    {$group: 
        {_id: "$code", name: "$name", count: {$sum: 1}}
    }
)

参照は次のとおりです。http://docs.mongodb.org/manual/reference/aggregation/

もちろん、この問題を解決するための最も効率的で簡単な方法は、スキーマを NoSQL 方式で設計して、この種のクエリを回避することです: http://www.mongodb.org/display/DOCS/Schema+Design現在のスキーマですが、そのようなクエリを頻繁に実行しようとしている場合は、NoSQL 指向ではない可能性があります。

于 2012-11-16T12:06:02.283 に答える
0

クライアント側で Map/Reduce 関数とソート結果を使用する必要があります。この質問を参照してください: Mongodb のグループと並べ替え

于 2012-11-16T11:31:06.190 に答える
0

Mongo db には、sql のようにカウントがありません。

mongodb でのカウントは、リストまたは配列で行うカウントのように機能します

mongodb のカウントは処理が遅いので注意することをお勧めします。

SQLで行うようにカウントするのではなく、リストの要素数を保持するフィールドを保持することをお勧めします。リストからの要素数が必要になるたびに、そのリストのカウントを使用しません

編集:

必要な結果を得るには、 map/reduceを使用する必要があります

http://www.mongovue.com/2010/11/03/yet-another-mongodb-map-reduce-tutorial/

ただし、これはさらに遅い操作であり、リアルタイムで使用することを意図したものではなく、定期的にバックグラウンドで実行されるタスクで使用することを念頭に置いてください。

于 2012-11-16T11:30:11.730 に答える