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
'programing' 카테고리의 다른 글
문자열에서 한 문자를 다른 문자로 바꾸기 (0) | 2023.07.03 |
---|---|
Mongoid 3 + Heroku(MongoHQ) 원인 모페드::오류::작업 실패 (0) | 2023.07.03 |
VBA 편집기는 줄 끝에 있는 공백을 자동으로 삭제합니다. (0) | 2023.07.03 |
git로 특정 디렉터리를 가져오는 방법 (0) | 2023.07.03 |
MongoDBC# 문자열에서 '좋아요' 쿼리 (0) | 2023.07.03 |