code: function _update(query, op, criteria, doc, options, force, callback) {
    query.op = op;
  
    if (Query.canMerge(criteria)) {
      query.merge(criteria);
    }
  
    if (doc) {
      query._mergeUpdate(doc);
    }
  
    if (utils.isObject(options)) {
      // { overwrite: true }
      query.setOptions(options);
    }
  
    // we are done if we don't have callback and they are
    // not forcing an unsafe write.
    if (!(force || callback)) {
      return query;
    }
  
    if (!query._update ||
        !query.options.overwrite && 0 === utils.keys(query._update).length) {
      callback && utils.soon(callback.bind(null, null, 0));
      return query;
    }
  
    options = query._optionsForExec();
    if (!callback) options.safe = false;
  
    criteria = query._conditions;
    doc = query._updateForExec();
  
    debug('update', query._collection.collectionName, criteria, doc, options);
    callback = query._wrapCallback(op, callback, {
      conditions: criteria,
      doc: doc,
      options: options
    });
  
    query._collection[op](criteria, doc, options, utils.tick(callback));
  
    return query;
  }
docs: /*!
  Internal helper for update, updateMany, updateOne