我对 MongoDb 很陌生。我使用查找并以 JSON 格式获取结果。
{"Name": "Harshil", "Age":20}
所以我需要在java中解析它并获取变量中的值。
String name should contain Harshil
int age should contain 20
有没有办法将这些细节存储在 JAVA 对象中?
以下是连接到 MongoDB 的方法:
MongoClient client = new MongoClient("localhost",27017); //with default server and port adress
DB db = client.getDB( "your_db_name" );
DBCollection collection = db.getCollection("Your_Collection_Name");
连接后,您可以从服务器中提取数据。下面,我假设您的文档具有名称和年龄字段:
DBObject dbo = collection.findOne();
String name = dbo.get("Name");
int age = dbo.get("Age");
看看GSON库。它将 JSON 转换为 Java 对象,反之亦然。
方法和工具有很多,gson就是其中之一
class Person {
private String name;
private int age;
public Person() {
// no-args constructor
}
}
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
如果我不添加此链接,我会感到松懈。
您可以使用 Java 驱动程序来完成:
DBObject dbo = ...
String s = dbo.getString("Name")
int i = dbo.getInt("Age")
应该考虑在 Java 驱动程序之上使用另一个框架,因为您有多个对象要管理。
由于我们不想使用已弃用的方法,因此您可以使用以下代码来执行此操作:
MongoClient mongo = new MongoClient( "localhost" , 27017 );
MongoDatabase database = mongo.getDatabase("your_db_name");
MongoCollection<Document> collection = database.getCollection("your_collection_name");
FindIterable<Document> iterDoc = collection.find();
MongoCursor<Document> dbc = iterDoc.iterator();
while(dbc.hasNext()){
try {
JsonParser jsonParser = new JsonFactory().createParser(dbc.next().toJson());
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(jsonParser, Person.class);
String name = person.get("Name");
String age = person.get("Age");
} catch (Exception e){
e.printStackTrace();
}
JsonFactory、JsonParser 等 Jackson 正在使用它来将 Document 反序列化为相关的 Entity 对象。
你考虑过Morphia吗?
@Entity
class Person{
@Property("Name") Date name;
@Property("Age") Date age;
}
我更喜欢使用新的 Mongodb Java API。它非常干净清晰。
public MyEntity findMyEntityById(long entityId) {
List<Bson> queryFilters = new ArrayList<>();
queryFilters.add(Filters.eq("_id", entityId));
Bson searchFilter = Filters.and(queryFilters);
List<Bson> returnFilters = new ArrayList<>();
returnFilters.add(Filters.eq("name", 1));
Bson returnFilter = Filters.and(returnFilters);
Document doc = getMongoCollection().find(searchFilter).projection(returnFilter).first();
JsonParser jsonParser = new JsonFactory().createParser(doc.toJson());
ObjectMapper mapper = new ObjectMapper();
MyEntity myEntity = mapper.readValue(jsonParser, MyEntity.class);
return myEntity;
}
详情见 http://ashutosh-srivastav-mongodb.blogspot.in/2017/09/mongodb-fetch-operation-using-java-api.html
由于发布了原始答案,因此不推荐使用DBObject
相应的方法client.getDB
。对于自新更新以来可能正在寻找解决方案的任何人,我已尽力翻译。
MongoClient client = new MongoClient("localhost",27017); //Location by Default
MongoDatabase database = client.getDatabase("YOUR_DATABASE_NAME");
MongoCollection<Document> collection = database.getCollection("YOUR_COLLECTION_NAME");
连接到文档后,有许多熟悉的方法可以将数据作为 Java 对象获取。假设您计划拥有多个包含人员name
及其人员的文档,age
我建议在 ArrayList 中收集所有文档(您可以将其可视化为包含姓名和年龄的行),那么您可以简单地挑选文档中的文档ArrayList
将它们转换为 java对象如下:
List<Document> documents = (List<Document>) collection.find().into(new ArrayList<Document>());
for (Document document : documents) {
Document person = documents.get(document);
String name = person.get("Name");
String age = person.get("Age");
}
老实说,for
循环并不是一种很好的方式,但我想帮助社区与弃用作斗争。
尝试使用此函数将 mongodb 返回的 JSON 转换为您的自定义 java 对象列表。
MongoClient mongodb = new MongoClient("localhost", 27017);
DB db = mongodb.getDB("customData-database");
DBCursor customDataCollection = db.getCollection("customDataList").find();
List<CustomJavaObject> myCustomDataList = null; // this list will hold your custom data
JSON json = new JSON();
ObjectMapper objectMapper = new ObjectMapper();
try {
//this is where deserialiazation(conversion) takes place
myCustomDataList = objectMapper.readValue(json.serialize(customDataCollection),
new TypeReference<List<Restaurant>>() {
});
} catch (IOException e) {
e.printStackTrace();
}
自定义Java对象:
public class CustomJavaObject{
//your json fields go here
String field1, field2;
int num;
ArrayList<String> attributes;
//....write relevantgetter and setter methods
}
示例 json:
{
"field1": "Hsr Layout",
"field2": "www.google.com",
"num": 20,
"attributes": [
"Benagaluru",
"Residential"
]
},
{
"field1": "BTM Layout",
"field2": "www.youtube.com",
"num": 10,
"attributes": [
"Bangalore",
"Industrial"
]
}