Java-драйвер MongoDb toJson() и $oid

Я создаю API Java Jersey, который использует драйвер MongoDb и MongoDb.

Ресурсы должны выводить сохраненный документ MongoDb в формате JSON для использования во внешнем проекте с использованием Svelte.

Из-за стандартной реализации org.bson.Document.toJson() вывод моих документов выглядит примерно так:

[{ "_id" : { "$oid" : "5e97f08f2175aa9174dbec0e" }, "hour" : 8, "minute" : 15, "enabled" : true, "duration" : 120 }

Я бы предпочел, чтобы это было:

[{ "_id" : "5e97f08f2175aa9174dbec0e", "hour" : 8, "minute" : 15, "enabled" : true, "duration" : 120 }

Таким образом, легче обрабатывать идентификатор во внешнем интерфейсе. Так как же избавиться от объекта $oid?

Мне уже удалось получить желаемый формат, используя:

JsonWriterSettings settings = JsonWriterSettings.builder()
                .outputMode(JsonMode.RELAXED)
                .objectIdConverter((value, writer) -> writer.writeString(value.toHexString()))
                .build();
        System.out.println(doc.toJson(settings));

Но как зарегистрировать этот объект настроек глобально, чтобы каждый вызов doc.toJson() использовал его?

А что будет, если я отправлю измененные или новые документы из фронтенда в API и сделаю:

Document document = Document.parse(doc);

Мое измененное поле _id снова автоматически преобразуется в ObjectId? Или мне нужен org.bson.codecs.Decoder или CodecRegistry? Как это сделать?


person mr.simonski    schedule 17.04.2020    source источник


Ответы (1)


$oid относится к типу поля ObjectId в спецификации bson. Насколько я знаю, вам нужно манипулировать своим документом, чтобы заменить ObjectId для вашего _id на String.

String oidAsString = document.getObjectId("_id").toString();
document.put("_id", oidAsString);
person relativelyPrime    schedule 21.04.2020