int Document::compare(const Document& rL, const Document& rR) { DocumentStorageIterator lIt = rL.storage().iterator(); DocumentStorageIterator rIt = rR.storage().iterator(); while (true) { if (lIt.atEnd()) { if (rIt.atEnd()) return 0; // documents are the same length return -1; // left document is shorter } if (rIt.atEnd()) return 1; // right document is shorter const ValueElement& rField = rIt.get(); const ValueElement& lField = lIt.get(); const int nameCmp = lField.nameSD().compare(rField.nameSD()); if (nameCmp) return nameCmp; // field names are unequal const int valueCmp = Value::compare(lField.val, rField.val); if (valueCmp) return valueCmp; // fields are unequal rIt.advance(); lIt.advance(); } }
int Document::compare(const Document& rL, const Document& rR, const StringData::ComparatorInterface* stringComparator) { DocumentStorageIterator lIt = rL.storage().iterator(); DocumentStorageIterator rIt = rR.storage().iterator(); while (true) { if (lIt.atEnd()) { if (rIt.atEnd()) return 0; // documents are the same length return -1; // left document is shorter } if (rIt.atEnd()) return 1; // right document is shorter const ValueElement& rField = rIt.get(); const ValueElement& lField = lIt.get(); // For compatibility with BSONObj::woCompare() consider the canonical type of values // before considerting their names. if (lField.val.getType() != rField.val.getType()) { const int rCType = canonicalizeBSONType(rField.val.getType()); const int lCType = canonicalizeBSONType(lField.val.getType()); if (lCType != rCType) return lCType < rCType ? -1 : 1; } const int nameCmp = lField.nameSD().compare(rField.nameSD()); if (nameCmp) return nameCmp; // field names are unequal const int valueCmp = Value::compare(lField.val, rField.val, stringComparator); if (valueCmp) return valueCmp; // fields are unequal rIt.advance(); lIt.advance(); } }