public void reconcile(String reconCollectionName, 
							String[] leftKeyFieldNames, Iterator<?>left, 
							String[] rightKeyFieldNames, Iterator<?>right) throws Exception {
		
		if (getFieldsToCompare() == null) {
			logger.debug("Fields to compare is null, bypassing field by field match.");
			List<ReconcileFieldToCompare> emptyList = new ArrayList<ReconcileFieldToCompare>();
			setFieldsToCompare(emptyList);
		}

		setReconCollectionName(reconCollectionName);
		setLeftKeyFieldNames(leftKeyFieldNames);
		setRightKeyFieldNames(rightKeyFieldNames);
		
		mongoTemplate.dropCollection(reconCollectionName);
		
		loadLeftSideData(left);
		loadRightSideData(right);

		List<ReconResults> results = getResults();

		// loop through the result list. Each ReconResult has a list of left/right side items where the keys matched
		// compare the fields on the two lists
		
		for (ReconResults result : results) {
			
			List<ReconData>leftList = result.getLeftList();
			List<ReconData>rightList= result.getRightList();
			boolean allFieldsMatched = true;
			
			if (leftList.size() != rightList.size()) {
				logger.debug(String.format("mismatched number of items for key:%s. left has:%d items, right has:%d items\n",
						result.getKey(), leftList.size(), rightList.size()));
				allFieldsMatched = false;
			}

			// bypass matching field by field for matched keys is there were no fields specified.
			if (getFieldsToCompare().size() > 0) {
				int maxToCompare = leftList.size() < rightList.size() ? leftList.size() : rightList.size();
				
				for (int i = 0; i < maxToCompare; i++) {
					ReconData leftItem = leftList.get(i);
					ReconData rightItem = rightList.get(i);
					if (matchFields(getFieldsToCompare(), leftItem.getData(), rightItem.getData())) {
						leftItem.setMatched(true);
						rightItem.setMatched(true);
					}
					else {
						logger.debug (String.format("fields didn't match for key:%s. item:%d.", result.getKey(), i));
						allFieldsMatched = false;
					}
				}
			}
			
			result.setMatched(allFieldsMatched);
			
			//TODO rewrite record with changes
			Query query = new Query(Criteria.where("key").is(result.getKey()));
			mongoTemplate.remove(query, reconCollectionName);
			mongoTemplate.save(result, reconCollectionName);
			
		}
		
		
	}