Anledningen är att BSON DateTime-formatet lagrar värden med mindre precision än ett .NET DateTime-värde, så när du läser tillbaka det från databasen har värdet trunkerats.
Om ditt DateTime-värde är en egenskap för en C#-klass du serialiserar kan du be serializern att serialisera DateTime-värdet som ett inbäddat dokument som innehåller både BSON DateTime-värdet (trunkerat) och det ursprungliga .NET DateTime-värdet (lagrat som Ticks). I så fall kommer värdet inte att trunkeras när det deserialiseras.
Till exempel:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Du kan också använda en Bson-representation av Int64 eller String och inte förlora precision, men då det lagrade dokumentet endast har Ticks eller en strängrepresentation och ingen BSON DateTime, vilket gör det svårt att göra DateTime-relaterade frågor.
Du bör också komma ihåg att DateTime-värden lagras i UTC i databasen. Det bästa är att alltid använda UTC-värden för lagring och endast använda lokala tider när de visas för användaren.