Mongodb + spring 学习记录

首先要记录的就是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中,要知道更新的具体字段,然后用查询区和更新器去更新.....

转载于:https://my.oschina.net/tulongx/blog/531692

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值