7

我有一个包含多个文档的 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 查询所有文档,然后进行一些后处理以获得唯一值?对于任何情况,语法都会受到赞赏。

4

3 回答 3

14

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

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

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

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

该查询生成一个 BSON 文档,其中包含Tom参加的课程列表。

注意注意返回值是单个文档,所以如果它超过最大文档大小(16 MB),你会得到错误,在这种情况下你必须切换到map/reduce方法来解决这类问题。

于 2012-08-17T14:41:40.380 回答
2
import pymongo
posts = pymongo.MongoClient('localhost', 27017)['db']['colection']


res = posts.find({ "geography": { "$regex": '/europe/', "$options": 'i'}}).distinct('geography')
print type(res)
res.sort()
for line in res:
    print line

参考http://docs.mongodb.org/manual/reference/method/db.collection.distinct/ distinct 返回一个列表,将打印在 print type(res) 上,可以使用 res.sort() 对列表进行排序,之后它将打印排序列表的值。

您还可以在选择不同的值之前查询帖子。

于 2013-11-14T23:07:12.207 回答
1
student_users = Students.objects(name = "Tom").distinct('class')
于 2012-08-17T18:59:06.927 回答