POJO для org.bson.Document и наоборот
Есть ли простой способ конвертировать Simple POJO в org.bson.Document?
Я знаю, что есть способы сделать это, как этот:
Document doc = new Document();
doc.append("name", person.getName()):
Но есть ли это гораздо проще и меньше опечаток?
7 ответов
Дело в том, что вам не нужно прикладывать руки к org.bson.Document.
Морфия сделает все это за тобой.
import com.mongodb.MongoClient;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.DatastoreImpl;
import org.mongodb.morphia.Morphia;
import java.net.UnknownHostException;
.....
private Datastore createDataStore() throws UnknownHostException {
MongoClient client = new MongoClient("localhost", 27017);
// create morphia and map classes
Morphia morphia = new Morphia();
morphia.map(FooBar.class);
return new DatastoreImpl(morphia, client, "testmongo");
}
......
//with the Datastore from above you can save any mapped class to mongo
Datastore datastore;
final FooBar fb = new FooBar("hello", "world");
datastore.save(fb);
Здесь вы найдете несколько примеров: https://mongodb.github.io/morphia/
В настоящее время Mongo Java Driver 3.6.3 обеспечивает поддержку POJO из коробки
http://mongodb.github.io/mongo-java-driver/3.6/bson/pojos/
Допустим, у вас есть такой пример коллекции с одним вложенным объектом
db.createCollection("product", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "description", "thumb"],
properties: {
name: {
bsonType: "string",
description: "product - name - string"
},
description: {
bsonType: "string",
description: "product - description - string"
},
thumb: {
bsonType: "object",
required: ["width", "height", "url"],
properties: {
width: {
bsonType: "int",
description: "product - thumb - width"
},
height: {
bsonType: "int",
description: "product - thumb - height"
},
url: {
bsonType: "string",
description: "product - thumb - url"
}
}
}
}
}
}});
1. Предоставьте bean-компоненту MongoDatabase правильную CodecRegistry
@Bean public MongoDatabase mongoDatabase() {
PojoCodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build();
CodecRegistry pojoCodecRegistry = CodecRegistries.fromRegistries(MongoClient.getDefaultCodecRegistry(), CodecRegistries.fromProviders(pojoCodecProvider));
MongoClient mongoClient = new MongoClient("localhost", 27017);
return mongoClient.getDatabase("example_db_name").withCodecRegistry(pojoCodecRegistry);
}
2. Аннотируйте свои POJOS
public class ProductEntity {
@BsonProperty("name") public final String name;
@BsonProperty("description") public final String description;
@BsonProperty("thumb") public final ThumbEntity thumbEntity;
@BsonCreator
public ProductEntity(
@BsonProperty("name") String name,
@BsonProperty("description") String description,
@BsonProperty("thumb") ThumbEntity thumbEntity) {
this.name = name;
this.description = description;
this.thumbEntity = thumbEntity;
}
}
public class ThumbEntity {
@BsonProperty("width") public final Integer width;
@BsonProperty("height") public final Integer height;
@BsonProperty("url") public final String url;
@BsonCreator
public ThumbEntity(
@BsonProperty("width") Integer width,
@BsonProperty("height") Integer height,
@BsonProperty("url") String url) {
this.width = width;
this.height = height;
this.url = url;
}
}
3. Запрос mongoDB и получить POJOS
MongoCollection<Document> collection = mongoDatabase.getCollection("product");
Document query = new Document();
List<ProductEntity> products = collection.find(query, ProductEntity.class).into(new ArrayList<>());
И это все!!! Вы можете легко получить ваш POJOS без обременительных ручных отображений и без потери способности выполнять нативные запросы монго
Ты можешь использовать Gson
а также Document.parse(String json)
конвертировать POJO в Document
, Это работает с версией 3.4.2 драйвера Java.
Что-то вроде этого:
package com.jacobcs;
import org.bson.Document;
import com.google.gson.Gson;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class MongoLabs {
public static void main(String[] args) {
// create client and connect to db
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("my_db_name");
// populate pojo
MyPOJO myPOJO = new MyPOJO();
myPOJO.setName("MyName");
myPOJO.setAge("26");
// convert pojo to json using Gson and parse using Document.parse()
Gson gson = new Gson();
MongoCollection<Document> collection = database.getCollection("my_collection_name");
Document document = Document.parse(gson.toJson(myPOJO));
collection.insertOne(document);
}
}
Я не знаю вашу версию MongoDB. Но в наши дни нет необходимости конвертировать документ в POJO или наоборот. Вам просто нужно создать свою коллекцию в зависимости от того, с чем вы хотите работать, Document или POJO следующим образом.
//If you want to use Document
MongoCollection<Document> myCollection = db.getCollection("mongoCollection");
Document doc=new Document();
doc.put("name","ABC");
myCollection.insertOne(doc);
//If you want to use POJO
MongoCollection<Pojo> myCollection = db.getCollection("mongoCollection",Pojo.class);
Pojo obj= new Pojo();
obj.setName("ABC");
myCollection.insertOne(obj);
Если вы хотите использовать POJO, убедитесь, что ваша база данных Mongo настроена с использованием правильного кода.
MongoClient mongoClient = new MongoClient();
//This registry is required for your Mongo document to POJO conversion
CodecRegistry codecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(),
fromProviders(PojoCodecProvider.builder().automatic(true).build()));
MongoDatabase db = mongoClient.getDatabase("mydb").withCodecRegistry(codecRegistry);
Если вы используете Spring Data MongoDB с springboot, у MongoTemplate есть способ сделать это хорошо.
API-интерфейс Spring Data MongoDB
Вот пример.
1. Сначала выполните автоподключение шаблона mongoTemplate в весеннем загрузочном проекте.
@Autowired
MongoTemplate mongoTemplate;
2. Используйте mongoTemplate в своем сервисе
Document doc = new Document();
mongoTemplate.getConverter().write(person, doc);
Для этого вам нужно настроить файл pom и yml для внедрения mongotemplate.
пом.xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
приложение.yml
# mongodb config
spring:
data:
mongodb:
uri: mongodb://your-mongodb-url
Если вы используете Morphia, вы можете конвертировать POJO в документ, используя этот фрагмент кода.
Document document = Document.parse( morphia.toDBObject( Entity ).toString() )
Если вы не используете Morphia, то вы можете сделать то же самое, написав собственное отображение и преобразовав POJO в DBObject, а затем преобразовав DBObject в строку, а затем проанализировав ее.
Нет, я думаю, это может быть полезно для bulkInsert. Я думаю, bulkInsert не может работать с pojo (если я не ошибаюсь). Если кто-то знает, как использовать bulkInsert