private CompareBsonDocumentsResult CompareBsonDocuments(TwoBsonDocuments twoBsonDocuments)
        {
            BsonDocument document1 = twoBsonDocuments.Document1;
            BsonDocument document2 = twoBsonDocuments.Document2;

            CompareBsonDocumentsResult result = new CompareBsonDocumentsResult(twoBsonDocuments, _comparatorOptions);
            result.DontSetDocumentReference = _dontSetDocumentReference;
            result.DocumentReferenceElements1 = _documentReferenceElements1;
            result.DocumentReferenceElements2 = _documentReferenceElements2;
            if (document1 == null && document2 == null)
                result.DocumentsType = DocumentsType.Document1AndDocument2AreNull;
            else if (document1 == null)
                result.DocumentsType = DocumentsType.Document1IsNull;
            else if (document2 == null)
                result.DocumentsType = DocumentsType.Document2IsNull;
            else
            {
                result.DocumentsType = DocumentsType.Document1AndDocument2AreNotNull;
                foreach (var twoDocElement in EnumerateTwoBsonDocumentsElements(document1, document2))
                {
                    CompareElementResult compareElements;
                    if (twoDocElement.Value1 != null && twoDocElement.Value2 != null)
                    {
                        //if (twoDocElement.Value1.IsString && twoDocElement.Value2.IsString)
                        //{
                        //    if (_stringComparisonIgnoreWhiteSpace)
                        //    {
                        //    }

                        //}
                        //if (_stringComparisonIgnoreCase && twoDocElement.Value1.IsString && twoDocElement.Value2.IsString)
                        //{
                        //    if (string.Equals(twoDocElement.Value1.AsString, twoDocElement.Value2.AsString, StringComparison.InvariantCultureIgnoreCase))
                        //        compareElements = CompareElementResult.Equal;
                        //    else
                        //        compareElements = CompareElementResult.NotEqual;
                        //}
                        //else if (twoDocElement.Value1 == twoDocElement.Value2)
                        //    compareElements = CompareElementResult.Equal;
                        //else
                        //    compareElements = CompareElementResult.NotEqual;
                        if (Equals(twoDocElement.Value1, twoDocElement.Value2))
                            compareElements = CompareElementResult.Equal;
                        else
                            compareElements = CompareElementResult.NotEqual;
                    }
                    else if (twoDocElement.Value1 != null)
                        compareElements = CompareElementResult.OnlyValue1;
                    else // if (twoDocElement.Value2 != null)
                        compareElements = CompareElementResult.OnlyValue2;
                    result.AddElement(twoDocElement.Name, compareElements, twoDocElement.Value1, twoDocElement.Value2);
                }
            }
            return result;
        }
        private IEnumerable<string> _documentReferenceElements2 = null;      // list of reference element from document 2

        public CompareBsonDocumentsResult(TwoBsonDocuments twoBsonDocuments, BsonDocumentComparatorOptions comparatorOptions)
        {
            _twoBsonDocuments = twoBsonDocuments;
            _comparatorOptions = comparatorOptions;
        }