0

私はこのようなテーブルを持っています:

# TABLE IN DB
| Cat | Date    | ... datas ... |
| 1   | 11-02   | data2
| 2   | 11-04   | data2
| 1   | 12-01   | data1
| 2   | 12-01   | data1
| 2   | 12-03   | data3
| 2   | 12-04   | data4

私の課題は、カテゴリごとに 1 つのエントリを取得し、特定のデータを選択することです (ここでは data1 を選択します)。出力例:

# TABLE RESULT
| Cat | Date    | ... datas ... |
| 1   | 11-02   | data2
| 2   | 11-04   | data2

実際には、配列内のすべてのカテゴリ番号と別の配列内のすべてのデータを取得しています。次に、「foreach」という 2 つのループを作成します。

foreach ($array_cat as $cat){
   foreach($array_data as $data){
        MONGO_FIND_HERE...
   }
}

コレクションは非常に大きく、多くの猫とデータがあるため、これは約 1000 から 5000 のクエリを作成し、完了するまでに 10 秒から 20 秒かかります。

どうすればこれを高速化できますか。申し訳ありませんが、MongoDB は初めてですが、大好きです :)

編集 1: 簡単な例

| Cat | Date    | ... datas ... |
| 1   | 11-02   | data2
| 2   | 11-04   | data2
| 1   | 12-01   | data1
| 2   | 12-01   | data1
| 2   | 12-03   | data3
| 2   | 12-04   | data4

最新の日付と "data2" を持つカテゴリごとに 1 つのエントリのみを持つにはどうすればよいですか? どの構造/アーキテクチャを使用すればよいですか?

# TABLE RESULT
| Cat | Date    | ... datas ... |
| 1   | 12-04   | data2
| 2   | 12-04   | data2

どのメカニズムを使用すればよいですか?「forループ」を使わずにそれを行う方法は? どのカテゴリが存在するかを知っている配列: array(1,2) があります。より良い :=) ?

4

1 に答える 1

0

私の課題は、カテゴリごとに 1 つのエントリを取得し、特定のデータを選択することです (ここでは data1 を選択します)。

そのために明確にしたいようです:

> db.runCommand({distinct: "coll", key: "category", query : {datas: "data1"}})

PHP の例については、http://php.net/manual/en/mongodb.command.phpを参照してください。

最新の日付と "data2" を持つカテゴリごとに 1 つのエントリのみを持つにはどうすればよいですか?

最新の日付がわかっている場合 (たとえば、12-04 のクエリ)、distinct を再度使用できます。

> db.runCommand({distinct: "coll", key: "category", query : {date: "12-04", datas: "data2"}})

最新の日付がカテゴリによって異なる可能性がある場合は、集計フレームワークを使用する必要があります: http://docs.mongodb.org/manual/aggregation/

どの構造/アーキテクチャを使用すればよいですか?

この情報に基づいて知るのはちょっと難しいです。何を保存しているのか (データとは何ですか?)、どれくらいあるのか (例えば、データごとのカテゴリ数やデータごとの日付など)、またはこれがアプリが通常実行する種類のクエリです。

于 2012-08-24T20:53:04.713 に答える