diff --git a/pymongo/helpers.py b/pymongo/helpers.py index a0393c088..225956ef4 100644 --- a/pymongo/helpers.py +++ b/pymongo/helpers.py @@ -235,7 +235,7 @@ def _fields_list_to_dict(fields, option_name): if isinstance(fields, collections.Mapping): return fields - if isinstance(fields, collections.Sequence): + if isinstance(fields, (collections.Sequence, collections.Set)): if not all(isinstance(field, string_type) for field in fields): raise TypeError("%s must be a list of key names, each an " "instance of %s" % (option_name, diff --git a/test/test_collection.py b/test/test_collection.py index 8b82cc441..1da207113 100644 --- a/test/test_collection.py +++ b/test/test_collection.py @@ -1743,6 +1743,16 @@ class TestCollection(IntegrationTest): self.assertTrue("hello" in db.test.find_one(projection=["hello"])) self.assertTrue("hello" not in db.test.find_one(projection=["foo"])) + + self.assertTrue("hello" in db.test.find_one(projection=("hello",))) + self.assertTrue("hello" not in db.test.find_one(projection=("foo",))) + + self.assertTrue("hello" in db.test.find_one(projection=set(["hello"]))) + self.assertTrue("hello" not in db.test.find_one(projection=set(["foo"]))) + + self.assertTrue("hello" in db.test.find_one(projection=frozenset(["hello"]))) + self.assertTrue("hello" not in db.test.find_one(projection=frozenset(["foo"]))) + self.assertEqual(["_id"], list(db.test.find_one(projection=[]))) self.assertEqual(None, db.test.find_one({"hello": "foo"}))