sql >> データベース >  >> NoSQL >> MongoDB

Mongoコーデックを自動的に作成する方法はありますか?

    これに対処する方法は次のとおりです(最終結果は、Lombok、Jackson、MongoDBの間で非常に滑らかです):

    プロバイダー:

    public class JacksonCodecProvider implements CodecProvider {
        private final ObjectMapper objectMapper;
    
        public JacksonCodecProvider(final ObjectMapper bsonObjectMapper) {
            this.objectMapper = bsonObjectMapper;
        }
    
        @Override
        public <T> Codec<T> get(final Class<T> type, final CodecRegistry registry) {
    
                return new JacksonCodec<>(objectMapper, registry, type);
    
        }
    }
    

    そしてコーデック自体:

    class JacksonCodec<T> implements Codec<T> {
        private final ObjectMapper objectMapper;
        private final Codec<RawBsonDocument> rawBsonDocumentCodec;
        private final Class<T> type;
    
        public JacksonCodec(ObjectMapper objectMapper,
                            CodecRegistry codecRegistry,
                            Class<T> type) {
            this.objectMapper = objectMapper;
            this.rawBsonDocumentCodec = codecRegistry.get(RawBsonDocument.class);
            this.type = type;
        }
    
        @Override
        public T decode(BsonReader reader, DecoderContext decoderContext) {
            try {
    
                RawBsonDocument document = rawBsonDocumentCodec.decode(reader, decoderContext);
                String json = document.toJson();
                return objectMapper.readValue(json, type);
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
    
        @Override
        public void encode(BsonWriter writer, Object value, EncoderContext encoderContext) {
            try {
    
                String json = objectMapper.writeValueAsString(value);
    
                rawBsonDocumentCodec.encode(writer, RawBsonDocument.parse(json), encoderContext);
    
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }
    
        @Override
        public Class<T> getEncoderClass() {
            return this.type;
        }
    }
    

    Lombokと最新のJacksonアノテーションを組み合わせると、次のようなことが可能になります(Javaコードのようには見えませんね):

    @JsonIgnoreProperties(ignoreUnknown=true)
    @JsonDeserialize(builder = Account.AccountBuilder.class)
    @Builder(toBuilder=true)
    @Value
    public class Account {
    
        @JsonProperty private String _id;
        @JsonProperty private long _version;
        @JsonProperty private String organizationName;
    
        @JsonPOJOBuilder(withPrefix = "")
        public static final class AccountBuilder {
        }
    
    }
    

    次に:

    Account account = collection.find(eq("_id", id)).first();
    System.out.println(account.getOrganizationName());
    


    1. どうすればFlaskでMongoDBを使用できますか?

    2. フィールドで$dateFromStringを使用する場合、結果にnullフィールドが含まれないようにしてください

    3. MongoDBは制限を$incに設定しました

    4. 集計クエリの$geoNearに関するあいまいさ