Причината е, че форматът BSON DateTime съхранява стойности с по-малка точност от стойност на .NET DateTime, така че когато го прочетете обратно от базата данни, стойността е съкратена.
Ако вашата стойност на DateTime е свойство на C# клас, който сериализирате, можете да поискате от сериализатора да сериализира стойността на DateTime като вграден документ, съдържащ както стойността на BSON DateTime (съкратена), така и оригиналната стойност на .NET DateTime (съхранена като Ticks). В този случай стойността няма да бъде съкратена при десериализация.
Например:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Можете също да използвате BsonRepresentation на Int64 или String и да не губите прецизност, но тогава съхранения документ само има Ticks или низово представяне и няма BSON DateTime, което затруднява извършването на свързани с DateTime заявки.
Също така трябва да имате предвид, че стойностите на DateTime се съхраняват в UTC в базата данни. Най-добрата практика е винаги да използвате UTC стойности за съхранение и да използвате само местни часове, когато ги показвате на потребителя.