一尘不染

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

python

我有一个包含多个文档的mongo集合,假设以下内容(假设出于任何原因,汤姆在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"
}

我希望能够查询“汤姆”曾经有过的所有不同的班级,即使汤姆有多个“历史”班级且有多个老师,我只想查询得到最少数量的文档,以便汤姆在所有这些都将显示一次,而“历史记录”只显示一次,而不是查询结果包含重复“历史记录”的多个文档。

我看了一下: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查询所有文档,然后进行一些后处理才能获得唯一值?在任何情况下,语法都会受到赞赏。


阅读 229

收藏
2021-01-20

共1个答案

一尘不染

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

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

因此,您可以尝试执行以下操作以获得结果:

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

此查询将导致一个BSON文档包含 Tom 参加的课程的列表。

注意 请注意,返回值是单个文档,因此,如果返回值超过最大文档大小(16 MB),则会出现错误,在这种情况下,您必须切换到 映射/缩小
方法来解决此类问题。

2021-01-20