mongodbscalacasbah

unknown top level operator: $query when using findOne


I had the following function, and wanted to modify it to return only the most recent item:

def findOne(filter: DBObject) = collection.findOne(filter)

So I tried this:

  def findOne(filter: DBObject) = {
    val query = MongoDBObject("$query" -> filter, "$orderby" -> MongoDBObject("created" -> -1))
    logger.info("Finding one: %s".format(query))
    collection.findOne(query)
  }

The logged queries looks something like this:

Finding one: { "$query" : { "_id" : { "$oid" : "5742d42154466f195b221175"}} , "$orderby" : { "created" : -1}}

But I get the following error:

com.mongodb.MongoQueryException: Query failed with error code 2 and error message 'unknown top level operator: $query'

What am I doing wrong?


Solution

  • As per casbah 2.7.3 documents findOne takes query and orderBy as arguments

    /**
       * Returns a single object from this collection matching the query.
       *
       * @param o           the query object
       * @param fields      (optional) fields to return
       * @param orderBy     (optional) a document whose fields specify the attributes on which to sort the result set.
       * @param readPrefs   (optional)
       * @param maxTime     (optional) the maximum duration that the server will allow this operation to execute before killing it
       *
       * @return            (Option[T]) Some() of the object found, or <code>None</code> if no such object exists
       */
      def findOne[A <% DBObject, B <% DBObject, C <% DBObject](o: A = MongoDBObject.empty,
                                                               fields: B = MongoDBObject.empty,
                                                               orderBy: C = MongoDBObject.empty,
                                                               readPrefs: ReadPreference = getReadPreference,
                                                               maxTime: Duration = Duration(0, MILLISECONDS)): Option[T]
    

    So i think this method should be

    def findOne(filter: DBObject) = {
        collection.findOne(filter,orderBy =MongoDBObject("created" -> -1))
      }
    

    i did not tested this code, i hope this will help.