我正在努力将数据从Mongodb
文件导入Json
我可以使用mongoimport command
在命令行中执行相同的操作
我探索并尝试了很多,但无法使用java从Json文件导入。
sample.json
{ "test_id" : 1245362, "name" : "ganesh", "age" : "28", "Job" :
{"company name" : "company1", "designation" : "SSE" }
}
{ "test_id" : 254152, "name" : "Alex", "age" : "26", "Job" :
{"company name" : "company2", "designation" : "ML" }
}
感谢您的时间。 〜了Ganesh〜
答案 0 :(得分:9)
假设您可以分别读取JSON字符串。例如,您阅读了第一个JSON文本
{ "test_id" : 1245362, "name" : "ganesh", "age" : "28", "Job" :
{"company name" : "company1", "designation" : "SSE" }
}
并将其分配给变量(String json1),下一步是解析它,
DBObject dbo = (DBObject) com.mongodb.util.JSON.parse(json1);
将所有 dbo 放入列表
List<DBObject> list = new ArrayList<>();
list.add(dbo);
然后将它们保存到数据库中:
new MongoClient().getDB("test").getCollection("collection").insert(list);
编辑:
在最新的MongoDB版本中,您必须使用Documents而不是DBObject,现在添加对象的方法看起来不同。这是一个更新的例子:
进口是:
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
代码是这样的(参考编辑上面的文字):
Document doc = Document.parse(json1);
new MongoClient().getDataBase("db").getCollection("collection").insertOne(doc);
您也可以按照列表的方式进行操作。但是你需要
new MongoClient().getDataBase("db").getCollection("collection").insertMany(list);
但我认为此解决方案存在问题。当您输入:
db.collection.find()
在mongo shell中获取集合中的所有对象,结果如下所示:
{ "_id" : ObjectId("56a0d2ddbc7c512984be5d97"),
"test_id" : 1245362, "name" : "ganesh", "age" : "28", "Job" :
{ "company name" : "company1", "designation" : "SSE"
}
}
与以前不完全相同。
答案 1 :(得分:2)
运行时r = Runtime.getRuntime();
处理p = null;
- dir是你的mongoimport所在的路径。
文件目录=新文件(“C:\ Program Files \ MongoDB \ Server \ 3.2 \ bin”);
- 此行将在给出dir时打开你的shell,导入的命令与在命令提升中使用mongoimport完全相同
p = r.exec(“c:\ windows \ system32 \ cmd.exe / c mongoimport --db mydb --collection student --type csv --file student.csv --headerline”,null ,DIR); 强>
答案 2 :(得分:1)
我自己也有类似的“问题”,最后使用Jackson和POJO databinding以及Morphia。
虽然这听起来有点像用大锤敲打坚果,但它实际上非常易于使用,强大且性能相当且易于维护代码。
小警告:如果要重复使用,请将test_id
字段映射到MongoDB的_id
。
您需要提示Jackson如何将数据从JSON文件映射到POJO。为了便于阅读,我将课程缩短了一点:
@JsonRootName(value="person")
@Entity
public class Person {
@JsonProperty(value="test_id")
@Id
Integer id;
String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
关于嵌入式文档Job
,请查看链接的POJO数据绑定示例。
在应用程序初始化期间的某个地方,您需要映射带注释的POJO。既然你已经有了MongoClient,我将重用它;)
Morphia morphia = new Morphia();
morphia.map(Person.class);
/* You can reuse this datastore */
Datastore datastore = morphia.createDatastore(mongoClient, "myDatabase");
/*
* Jackson's ObjectMapper, which is reusable, too,
* does all the magic.
*/
ObjectMapper mapper = new ObjectMapper();
现在导入给定的JSON文件就像
一样简单public Boolean importJson(Datastore ds, ObjectMapper mapper, String filename) {
try {
JsonParser parser = new JsonFactory().createParser(new FileReader(filename));
Iterator<Person> it = mapper.readValues(parser, Person.class);
while(it.hasNext()) {
ds.save(it.next());
}
return Boolean.TRUE;
} catch (JsonParseException e) {
/* Json was invalid, deal with it here */
} catch (JsonMappingException e) {
/* Jackson was not able to map
* the JSON values to the bean properties,
* possibly because of
* insufficient mapping information.
*/
} catch (IOException e) {
/* Most likely, the file was not readable
* Should be rather thrown, but was
* cought for the sake of showing what can happen
*/
}
return Boolean.FALSE;
}
通过一些refatcoring,可以在Jackson注释bean的通用导入器中进行转换。 显然,我遗漏了一些特殊情况,但这不属于这个答案的范围。
答案 3 :(得分:1)
使用3.2驱动程序,如果你有一个mongo集合和一组json文档,例如:
Route.all
您可以单独插入:
yAxis:0, //for first series
yAxis:1 //for second series
或批量:
MongoCollection<Document> collection = ...
List<String> jsons = ...
答案 4 :(得分:1)
我今天刚刚面对这个问题并以另一种方式解决了这个问题,而没有人满意我,所以尽情享受我的额外贡献。性能足以导出30k文档并将其导入我的Springboot应用程序以进行集成测试用例(需要几秒钟)。
首先,您首先导出数据的方式很重要。 我想要一个文件,其中每行包含1个我可以在我的Java应用程序中解析的文档。
mongo db --eval 'db.data.find({}).limit(30000).forEach(function(f){print(tojson(f, "", true))})' --quiet > dataset.json
然后我从我的资源文件夹中获取文件,解析它,提取行,并使用mongoTemplate处理它们。可以使用缓冲区。
@Autowired
private MongoTemplate mongoTemplate;
public void createDataSet(){
mongoTemplate.dropCollection("data");
try {
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(DATASET_JSON);
List<Document> documents = new ArrayList<>();
String line;
InputStreamReader isr = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
documents.add(Document.parse(line));
}
mongoTemplate.insert(documents,"data");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
答案 5 :(得分:1)
List<Document> jsonList = new ArrayList<Document>();
net.sf.json.JSONArray array = net.sf.json.JSONArray.fromObject(json);
for (Object object : array) {
net.sf.json.JSONObject jsonStr = (net.sf.json.JSONObject)JSONSerializer.toJSON(object);
Document jsnObject = Document.parse(jsonStr.toString());
jsonList.add(jsnObject);
}
collection.insertMany(jsonList);
答案 6 :(得分:-1)
public static void importCSV(String path) {
try {
List<Document> list = new ArrayList<>();
MongoDatabase db = DbConnection.getDbConnection();
db.createCollection("newCollection");
MongoCollection<Document> collection = db.getCollection("newCollection");
BufferedReader reader = new BufferedReader(new FileReader(path));
String line;
while ((line = reader.readLine()) != null) {
String[] item = line.split(","); // csv file is "" separated
String id = item[0]; // get the value in the csv assign keywords
String first_name = item[1];
String last_name = item[2];
String address = item[3];
String gender = item[4];
String dob = item[5];
Document document = new Document(); // create a document
document.put("id", id); // data into the database
document.put("first_name", first_name);
document.put("last_name", last_name);
document.put("address", address);
document.put("gender", gender);
document.put("dob", dob);
list.add(document);
}
collection.insertMany(list);
}catch (Exception e){
System.out.println(e);
}
}