         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

                  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)
                    return callback()

                  # check next key

        (delete find_query[key]; ins[key] = value.$in) for key, value of find_query when value?.$in
        ins_size = _.size(ins)

        # NOTE: we clone the data out of the store since the caller could modify it

        # use find
        if keys.length or ins_size
          if @_cursor.$ids
            for id, model_json of @store
              json.push(_.clone(model_json)) if _.contains(@_cursor.$ids, model_json.id) and _.isEqual(_.pick(model_json, keys), find_query)
            callback()

          else
