首先要记录的就是jar包问题.
mongodb.1.6以上的版本需要配置的spring的版本4.0以上!!!
maven真的很多坑的啊
mongo配置:
<!-- Default bean name is 'mongo' -->
<mongo:mongo host="localhost" port="27017" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo" />
<!-- 连接数据库名称 -->
<constructor-arg name="databaseName" value="test" />
</bean>
在spring文件中
<!-- 加载mongo配置 -->
<import resource="mongo-config.xml"/>
另外还有一个一个mongo加载的异常, 这里没有记录下来,但是网上搜索了一圈说是加上
http://www.springframework.org/schema/data/repository
http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
不知道有没有效果.
Stringmvc集成mongo使用的类似hibernate已经打包好的方法:
MongoTemplate mongoTemplate;
具体的不写,都类似ssh配置的.我这里全部用注解实现, 三层(数据操作层dao, 业务逻辑service, 控制器controller)
记录几个遇到的问题:
mongodb的特性,可能不太支持类似sql的saveOrUpdate方式,必须自己写具体的更新内容,也就是更新器和查询器每次都要自己写.最后还是要自己封装一些方法,即便是使用泛型之类的,也比较麻烦.
实例:
现在我有2个bean:
文章类 Article.java content是以段落形式存储
public class Article implements Serializable{
private String id;
private String title;
private List<ArticleContent> content;
---get/set---
}
文章段落 ArticleContent.java 对应文字或者图片,
public class ArticleContent implements Serializable{
private String id;
private String type;
private String text;
---get/set---
}
在数据库中得存储格式:
{ "_id" : "8c89956e-b07a-444b-aba9-e0f0f98d2566", "_class" : "com.xxx.bean.Article", "title" : "我是标题!", "createTime" : "2015-11-10", "content" : [ { "_id" : "95b2909e-aa40-498e-936c-6d5e4d3988ae", "type" : "text", "text" : "1我是内容啊,段落什么的" },{ "_id" : "95b2459e-aad0-498e-926c-6d4e4d3288dv", "type" : "text", "text" : "2我是内容啊,段落什么的" } ] }
如果要实现将第二个段落删除, 在sql中超级容易呐.但是mongo就麻烦了.
// 删除内容, 第一个参数:文章id, 第二个参数:内容id
public Integer removeContent(String aid, String cid) {
Query query = new Query().addCriteria(Criteria.where("id").is(aid));
// BasicQuery bq = new BasicQuery("{_id:\""+ aid +"\"}");
Update update = new Update();
// 先要找出文章
Article a = adao.findById(aid);
ArticleContent c = null;
int num = 0;
// 然后循环内容
for (ArticleContent ac : a.getContent()) {
if(ac.getId().equals(cid)){
c = ac;
num ++;
}
}
// 匹配到内容对象, 这里一定是要和bean的type格式一样.
// 在上面我的bean中内容是一个ArticleContent对象,这里就要传入ArticleContent对象
update.pull("content", c);//pull删除
WriteResult wr = adao.updateObject(query, update);
return wr.getN();
}
如果是在数据库中直接就:
db.Article.update({_id:"id的值"},{$pull:{content:{"_id":"内容id"}}},false,false);
不知道是不是我学的不够多,几天时间吧.但是不知道mongo的java驱动支不支持原生shell.
上面的例子里面的查询器都可以进行原生语句查询.
如果可是请大家在下面回复告诉我..我还是写shell来的快啊.
然后就是对象更新, 比如我修改了Article这个对象的内容, 如果是hibernate的话直接有saveOrUpdate,一次就更新了.但是mongo中,要知道更新的具体字段,然后用查询区和更新器去更新.....