code: function areThingsEqual (a, b) {
    var aKeys , bKeys , i;
  
    // Strings, booleans, numbers, null
    if (a === null || typeof a === 'string' || typeof a === 'boolean' || typeof a === 'number' ||
        b === null || typeof b === 'string' || typeof b === 'boolean' || typeof b === 'number') { return a === b; }
  
    // Dates
    if (util.isDate(a) || util.isDate(b)) { return util.isDate(a) && util.isDate(b) && a.getTime() === b.getTime(); }
  
    // Arrays (no match since arrays are used as a $in)
    // undefined (no match since they mean field doesn't exist and can't be serialized)
    if ((!(util.isArray(a) && util.isArray(b)) && (util.isArray(a) || util.isArray(b))) || a === undefined || b === undefined) { return false; }
  
    // General objects (check for deep equality)
    // a and b should be objects at this point
    try {
      aKeys = Object.keys(a);
      bKeys = Object.keys(b);
    } catch (e) {
      return false;
    }
  
    if (aKeys.length !== bKeys.length) { return false; }
    for (i = 0; i < aKeys.length; i += 1) {
      if (bKeys.indexOf(aKeys[i]) === -1) { return false; }
      if (!areThingsEqual(a[aKeys[i]], b[aKeys[i]])) { return false; }
    }
    return true;
  }
docs: Check whether 'things' are equal
  Things are defined as any native types (string, number, boolean, null, date) and objects
  In the case of object, we check deep equality
  Returns true if they are, false otherwise