diff --git a/gridfs/__init__.py b/gridfs/__init__.py index 3aaacbd63..614cc7a19 100644 --- a/gridfs/__init__.py +++ b/gridfs/__init__.py @@ -280,6 +280,36 @@ class GridFS(object): name for name in self.__files.distinct("filename") if name is not None] + def find_one(self, spec_or_id=None, *args, **kwargs): + """Get a single file from gridfs. + + All arguments to :meth:`find` are also valid arguments for + :meth:`find_one`, although any `limit` argument will be + ignored. Returns a single gridfs file, or ``None`` if no matching + file is found. For example:: + + file = fs.find_one({"filename": "lisa.txt"}) + + :Parameters: + + - `spec_or_id` (optional): a dictionary specifying + the query to be performing OR any other type to be used as + the value for a query for ``"_id"`` in the file collection. + + - `*args` (optional): any additional positional arguments are + the same as the arguments to :meth:`find`. + + - `**kwargs` (optional): any additional keyword arguments + are the same as the arguments to :meth:`find`. + """ + if spec_or_id is not None and not isinstance(spec_or_id, dict): + spec_or_id = {"_id": spec_or_id} + + for file in self.find(spec_or_id, *args, **kwargs): + return file + + return None + def find(self, *args, **kwargs): """Query GridFS for files.