2

次のようなドキュメントを含むコレクションがあるとします—</p>

{
    'name': 'Hawaiian',
    'toppings': ['ham', 'cheese', 'pineapple'],
}

または—</p>

{
    'name': 'Peperonni',
    'toppings': ['cheese', 'pepperoni'],
}

topping複数のドキュメントに表示されるすべての のリストを取得するにはどうすればよいですか? したがって、上記の 2 つのドキュメントの場合は、 になりますcheese

データベースにできるだけ「近い」ことが理想です。 を使用してすべてのトッピングのリストを取得distinctし、アプリケーション レベルですべてのドキュメントをループできることはわかっていますが、それではコストがかかりすぎます。

ありがとう!

4

2 に答える 2

5

長い質問ですが、ご覧ください。これは、mongodb2.2を使用した集約フレームワークです。

db.test2.aggregate({$project:{"toppings":1, "_id":0}}, {$unwind:"$toppings"}, {$group:{"_id":"$toppings", count:{$sum:1}}}, {$match:{count:{$gt:1}}}, {$project:{"_id":1}})

{ "result" : [ { "_id" : "cheese" } ], "ok" : 1 }

私のクエリステップを説明してください:

  1. toppingsフィールドだけが欲しい
  2. のすべての値を展開しますtoppings
  3. の値でグループ化しtoppings、数を数えます
  4. 1より大きい値の数を見つけます
  5. 値(トッピング)のみを取得countする必要はありません。
于 2012-11-05T17:58:59.070 に答える
1

すべてのトッピングのリストを取得してから、

db.coll.find({"topping": topping}).count() > 1

これをmongoシェルで試したので、pymongoの構文はまったく同じですが、カウントが実装されている場所(pymongoまたはデータベース)がわかりません。

[編集]

pymongoはcount()をmongodbに委任しているように見えるため、完全なクエリではなく、データベースによってカウント操作が実行されます。

于 2012-11-05T17:37:01.057 に答える