         (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(model_json) if _.contains(@_cursor.$ids, model_json.id) and _.isEqual(_.pick(model_json, keys), find_query)
+              json.push(_.clone(model_json)) if _.contains(@_cursor.$ids, model_json.id) and _.isEqual(_.pick(model_json, keys), find_query)
             callback()
 
           else

                  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

        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
