                   return callback(err) if err
                   return callback() unless is_match
                   if not find_keys.length or (exists and (keys.length isnt find_keys.length)) # exists only needs one result
-                    json.push(model_json)
+                    json.push(_.clone(model_json))
                     return callback()
 
                   # check next key

            json = json.splice(0, Math.min(json.length, @_cursor.$limit))
          callback()

        queue.defer (callback) =>
          return callback() unless @_cursor.$include
          json = (_.clone(model_json) for model_json in json) # ensure we don't update the underlying store
          @fetchIncludes(json, callback)

      queue.await =>
        return callback(null, (if _.isArray(json) then json.length else (if json then 1 else 0))) if @hasCursorQuery('$count')

        else
          # filter by ids
          if @_cursor.$ids
            json.push(_.clone(model_json)) for id, model_json of @store when _.contains(@_cursor.$ids, model_json.id)
          else
            json = (_.clone(model_json) for id, model_json of @store)
          callback()

      if not exists
