public static Result SaveObjects(List <Object> objects) { Result result = new Result() { Code = ResultCode.Success }; try { foreach (Object obj in objects) { //new object to be saved... BsonDocument doc = GetBSONDocument(obj); //get if any existing object from db... //FilterDefinition<BsonDocument> fc = Builders<BsonDocument>.Filter.Eq(Constants.AttribObjectId,obj.Id); FilterDefinition <BsonDocument> fc = Builders <BsonDocument> .Filter.And(new FilterDefinition <BsonDocument>[] { Builders <BsonDocument> .Filter.Eq(Constants.AttribObjectId, obj.Id), Builders <BsonDocument> .Filter.Lt(Constants.AttribTimestamp, new BsonTimestamp((long)obj.Timestamp)) }); BsonDocument existing = MongoDBConnector.FindOne <BsonDocument>(obj.Type, fc); //find - ObjectId, order by timestamp desc top 1 if (existing != null) { existing.Remove("_id"); foreach (BsonElement e in doc.Elements) { existing[e.Name] = e.Value; } doc = existing; } Task.Run(() => MongoDBConnector.insert <BsonDocument>(doc, obj.Type)).Wait(); #region "Update future records" //to update future records if any.. BsonDocument filterCriteria = new BsonDocument(); filterCriteria.Add(Constants.AttribObjectId, obj.Id); filterCriteria.Add(Constants.AttribTimestamp, new BsonDocument().Add("$gte", new BsonTimestamp((long)obj.Timestamp))); List <BsonDocument> docs = null; try { docs = MongoDBConnector.find <BsonDocument>(obj.Type, filterCriteria); } catch { //no docs found... } if (docs != null) { foreach (BsonDocument futureDoc in docs) { bool changed = false; foreach (BsonElement e in doc.Elements) { if (futureDoc.Elements.Where(fe => fe.Name == e.Name).Count() == 0) { futureDoc.Add(e); changed = true; } } if (changed) { fc = Builders <BsonDocument> .Filter.Eq("_id", futureDoc.GetElement("_id").Value); Task.Run(() => MongoDBConnector.ReplaceOne <BsonDocument>(obj.Type, fc, futureDoc)).Wait(); } } } #endregion } } catch { result.Code = ResultCode.Error; } return(result); }