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

            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')

                  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(_.clone(model_json))
                    return callback()

                  # check next key
