programing

MongoDB에서 10진수 유형을 사용하는 방법

stoneblock 2023. 7. 3. 22:31

MongoDB에서 10진수 유형을 사용하는 방법

표준 C# 드라이버를 사용하여 MongoDB에 소수점을 저장하려면 어떻게 해야 합니까?모든 소수점 이하는 문자열로 데이터베이스 안에 저장되어 있는 것 같습니다.

MongoDB는 MongoDB v3.4까지 소수점 이하를 제대로 지원하지 않습니다.이 버전 이전에는 소수점을 문자열로 저장하여 정확한 오류를 방지했습니다.

Prev3.4 소수점 이하를 문자열로 저장하지만 산술 연산이 불가능합니다.연산자:$min,$avg...이용할 수 없습니다.정밀도가 중요하지 않은 경우 다음으로 전환할 수 있습니다.double.

v3.4+ 다음 전제 조건이 올바른지 확인해야 합니다.

  • MongoDB 서버는 v3.4 이상이어야 합니다.
  • MongoC SharpDriver는 v2.4.3 이상이어야 합니다.
  • 데이터베이스는 다음을 수행해야 합니다.featureCompatibilityVersion로 설정한.'3.4'데이터베이스가 이전 MongoDB 버전으로 작성되었으며 서버를 v3.4로 업그레이드한 경우 데이터베이스가 여전히 이전 버전에 있을 수 있습니다.

모든 속성을 설정한 경우 다음 직렬화 프로그램을 등록하여decimal128유형:

BsonSerializer.RegisterSerializer(typeof(decimal), new DecimalSerializer(BsonType.Decimal128));
BsonSerializer.RegisterSerializer(typeof(decimal?), new NullableSerializer<decimal>(new DecimalSerializer(BsonType.Decimal128)));

저는 최근에 이 문제에 부딪혔습니다.저는 단순히 제 목표에 다음과 같은 주석을 달아 해결했습니다.

[BsonRepresentation(BsonType.Decimal128)]
public decimal Price {get; set;}

사용하는 데 문제가 있었습니다.RegisterSerializer이미 직렬화 장치가 등록되어 있다고 불평했기 때문에 접근할 수 있지만, 대안은 자체 직렬화 공급자를 작성하여 사용하는 것입니다.

다음은 공급업체입니다.

public class CustomSerializationProvider : IBsonSerializationProvider
{
    private static readonly DecimalSerializer DecimalSerializer = new DecimalSerializer(BsonType.Decimal128);
    private static readonly NullableSerializer<decimal> NullableSerializer = new NullableSerializer<decimal>(new DecimalSerializer(BsonType.Decimal128));

    public IBsonSerializer GetSerializer(Type type)
    {
        if (type == typeof(decimal)) return DecimalSerializer;
        if (type == typeof(decimal?)) return NullableSerializer;

        return null; // falls back to Mongo defaults
    }
}

전화로 등록해야 합니다.

BsonSerializer.RegisterSerializationProvider(new CustomSerializationProvider());

저는 에릭 킨들링처럼 물체에 다음과 같은 주석을 달아 해결했습니다.

[BsonRepresentation(BsonType.Decimal128)]
public decimal Price {get; set;}

그러나 mongodb 컬렉션을 다시 채우는 것이 중요합니다. 그렇지 않으면 문자열 값이 보존됩니다.필드 값을 올바르게 삽입하면 다음 형식이 됩니다.

"Price" : NumberDecimal("99")

언급URL : https://stackoverflow.com/questions/43473147/how-to-use-decimal-type-in-mongodb