如何使用python查询mongodb中的不同结果?

Rol*_*ndo 6 python mongodb mongoengine

我有一个包含多个文档的mongo集合,假设如下(假设Tom因为某种原因在2012年有两位历史教师)

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

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


{
"name" : "Tom",
"year" : 2012,
"class" : "History",
"Teacher" : "Reiser"
}
Run Code Online (Sandbox Code Playgroud)

我希望能够查询"Tom"曾经拥有的所有不同的类,即使Tom有多个"历史"类和多个教师,我只是希望查询获得Tom所在的最小数量的文档所有这些,并且"历史"显示一次,而不是具有包含重复"历史"的多个文档的查询结果.

我看了看:http: //mongoengine-odm.readthedocs.org/en/latest/guide/querying.html

并希望能够尝试类似的东西:

student_users = Students.objects(name = "Tom", class = "some way to say distinct?")
Run Code Online (Sandbox Code Playgroud)

虽然它似乎没有记录.如果这不是语法上正确的方法,这可能在mongoengine中,或者有一些方法可以用像pymongo这样的其他库来实现吗?或者我是否必须使用Tom查询所有文档然后进行一些后处理才能获得唯一值?无论如何,语法都会受到赞赏.

Ros*_*nko 11

首先,它只能在某些字段(只有一个字段)上获得不同的值,如MongoDB的Distinct文档中所述.

Mongoengine的QuerySet类确实支持distinct()方法来完成这项工作.

所以你可以尝试这样的结果来获得结果:

Students.objects(name="Tom").distinct(field="class")
Run Code Online (Sandbox Code Playgroud)

此查询将生成一个包含Tom参加的类列表的BSON文档.

注意请注意,返回的值是单个文档,因此如果它超过最大文档大小(16 MB),您将收到错误,在这种情况下,您必须切换到map/reduce方法来解决此类问题.

  • @Seiverence,如果你想为更多那个字段解决这个任务,你有两种方法1)Python代码中的过滤结果2)使用map/reduce技术. (2认同)