その理由は、BSON DateTime形式は、.NET DateTime値よりも精度が低い値を格納するため、データベースから読み戻すときに、値が切り捨てられているためです。
DateTime値がシリアル化するC#クラスのプロパティである場合は、BSON DateTime値(切り捨て)と元の.NET DateTime値(Ticksとして格納)の両方を含む埋め込みドキュメントとしてDateTime値をシリアル化するようにシリアライザーに依頼できます。その場合、逆シリアル化されたときに値は切り捨てられません。
例:
public class MyClass {
public ObjectId Id;
[BsonRepresentation(BsonType.Document)]
public DateTime MyDateTime;
}
Int64またはStringのBsonRepresentationを使用して精度を失うことはありませんが、保存されたドキュメントはのみ ティックまたは文字列表現があり、BSON DateTimeがないため、DateTime関連のクエリを実行するのが困難です。
また、DateTime値はUTCでデータベースに保存されることにも注意してください。ベストプラクティスは、ストレージに常にUTC値を使用し、ユーザーに表示するときは現地時間のみを使用することです。