我尝试使用Spring Data将以下DBObject插入MongoDB:
BasicDBObject document = new BasicDBObject();
document.put("country", "us");
document.put("city", "NY");
mongoTemplate.insert(document);
其中mongoTemplate是我的Spring模板(org.springframework.data.mongodb.core.MongoTemplate)。
执行时,我得到:
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: No Persitent Entity information found for the class com.mongodb.BasicDBObject
at org.springframework.data.mongodb.core.MongoTemplate.determineCollectionName(MongoTemplate.java:1747)
at org.springframework.data.mongodb.core.MongoTemplate.determineEntityCollectionName(MongoTemplate.java:1732)
at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:658)
我的JSON最终将是动态的。那么任何想法如何动态提供这些实体信息? 或者是否有另一种方法可以通过Spring Data将原始JSON插入Mongodb?
答案 0 :(得分:10)
使用java驱动程序将spring-data与正常的mongo持久性混淆。
如果你想使用java驱动程序直接将数据保存到mongoDB,那么你将使用你所展示的BasicDBObject,除了你不会使用mongoTemaplate类来保持,而是使用MongoClient类。所以它看起来像这样:
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
DB db = mongoClient.getDB( "mydb" );
BasicDBObject o = new BasicDBObject();
o.set......
coll.insert(o);
但是如果你试图使用spring-data来保存文档,那么你需要创建一个java类来表示你的文档(例如:Person)并使用@Document(collection =“person”)注释这个类,然后使用mongoTemplate(这是一个特定于spring数据的类来保存这个实体。这与使用JPA / hibernate非常相似。
所以它看起来像这样
@Document(collection="person")
public class Person {
private String fisrtName;
....
Relevant getters and setters
}
然后是持久性
Person p = new Person();
p.setFirstName("foo");
p.setLastName("bar");
....
mongoTemplate.save(p);
答案 1 :(得分:2)
另一种方法是通过DBCollection
直接访问MongoTemplate
对象:
DBObject company = new BasicDBObject();
...
DBCollection collection = mongoTemplate.getCollection("company");
collection.insert(company);
答案 2 :(得分:1)
另一种方法
导入语句
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.springframework.data.mongodb.core.MongoTemplate;
会员变量
@Autowired MongoTemplate mongoTemplate;
MongoCollection<Document> collection;
@PostConstruct
public void init(){
collection = mongoTemplate.getCollection("company");
}
然后,方法
public void insertRawData(){
Document company = new Document(new HashMap()); // If you have to insert a hashMap
// otherwise you can add one-by-one using company.put("foo","bar")
collection.insertOne(company);
}