7

私は複数のドキュメントを含む mongo コレクションを持っています。次のように仮定します (Tom には何らかの理由で 2012 年に歴史の教師が 2 人いたと仮定します)。

{
"name" : "Tom"
"year" : 2012
"class" : "History"
"Teacher" : "Forester"
}

{
"name" : "Tom"
"year" : 2011
"class" : "Math"
"Teacher" : "Sumpra"
}


{
"name" : "Tom",
"year" : 2012,
"class" : "History",
"Teacher" : "Reiser"
}

「トム」がこれまでに持っていたすべての個別のクラスを照会できるようにしたいのですが、トムは複数の「歴史」クラスを複数の教師と持っていましたが、トムがいるような最小数のドキュメントをクエリで取得したいだけです「History」を含む複数のドキュメントを含むクエリ結果が繰り返されるのとは対照的に、「History」は 1 回だけ表示されます。

私は見ました: http://mongoengine-odm.readthedocs.org/en/latest/guide/querying.html

次のようなことを試してみたい:

student_users = Students.objects(name = "Tom", class = "some way to say distinct?")

文書化されていないようですが。これが構文的に正しい方法ではない場合、これはmongoengineで可能ですか、またはpymongoのような他のライブラリで達成する方法はありますか? それとも、Tom ですべてのドキュメントをクエリしてから、後処理を行って一意の値を取得する必要がありますか? 構文は、どのような場合でも高く評価されます。

4

3 に答える 3

14

まず、MongoDB のドキュメント on Distinctで説明されているように、一部のフィールド (1 つのフィールドのみ) で異なる値を取得することしかできません。

Mongoengine のQuerySetクラスは、この仕事を行うためにdistinct()メソッドをサポートしています。

したがって、結果を得るために次のようなことを試すことができます。

Students.objects(name="Tom").distinct(field="class")

このクエリの結果、 Tomが出席するクラスのリストを含む 1 つの BSON ドキュメントが生成されます。

注意: 返される値は 1 つのドキュメントであるため、最大ドキュメント サイズ (16 MB) を超えるとエラーが発生し、そのような問題を解決するにはマップ/リデュースアプローチに切り替える必要があることに注意してください。

于 2012-08-17T14:41:40.380 に答える
1
student_users = Students.objects(name = "Tom").distinct('class')
于 2012-08-17T18:59:06.927 に答える