43

I am using pymongo and want to have distinct values for a field such that I can also pass other query parameters. For example, I have entries like:

{
   id = "my_id1"
   tags: [tag1, tag2, tag3],
   category: "movie",
}
{
   id = "my_id2"
   tags: [tag3, tag6, tag9],
   category: "tv",
}
{
   id = "my_id3"
   tags: [tag2, tag6, tag8],
   category: "movie",
}

So I want to have all distinct tags under movie category. Can anyone please guide how can I achive this using pymongo. In mongo javascript shell, I issued db.mycoll.distinct('tags', {category: "movie"}) and it worked just fine. But when I do the same in pymongo it raises error. I guess it is not supported in pymongo. Any idea though how can such a task be achieved.

Nathan Villaescusa
  • 17,331
  • 4
  • 53
  • 56
Sushant Gupta
  • 8,980
  • 5
  • 43
  • 48

3 Answers3

78

You have to make the distinct call on the cursor returned from a find instead of on the collection:

tags = db.mycoll.find({"category": "movie"}).distinct("tags")
JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
24

pymongo (since v1.1.1) supports collection.distinct('key')

Graham Russell
  • 997
  • 13
  • 24
7

Actually there is a filter parameter you can pass in distinct method as mentioned in the pymongo Doc,

Pymongo Distinct

like this

distinct_tags = db.mycoll.distinct("tags",{"category": "movie"})
Mayur Dangar
  • 502
  • 6
  • 9