mongodb 不覆盖原文档但更新已有字段方法

java mongodb 提供入库三个方法,insert ,update,和save

介绍请参考下面的博客
Mongodb数据更新命令、操作符

但是update方法如果使用不当还是会直接覆盖原文档
下面是不覆盖的解决方法和说明


    @Override
public boolean saveUser(UserStore userStore) {
    try {
        /**
         * 查询里面应该包含文档的唯一主键,我这里是_id和userUrn,<br>
         * 两个值都为我的bean UserSore里面userUrn,<br>
         * 注:我的UserStore 类的字段和mongo字段名字是对应的
         */
        Query query = Query.query(Criteria.where("userUrn")
                .is(userStore.getUserUrn()).and("_id")
                .is(userStore.getUserUrn()));
        // 这里我用了我的方法把我的UserStore转换成BDObject类型的对象
        DBObject dbObject = ConvertHelper.convert(userStore);
        // 可以不移除这两个字段,我移除是因为它俩是主键,数据库里面一定是唯一并且不用修改的,所以直接移除
        dbObject.removeField("_id");
        dbObject.removeField("userUrn");

        /**
         * mongoNsTemplate是spring mongo data里面的对象,<br>
         * 我直接调用getCollection()方法获得java mongo driver里面的
         * DBCollecton对象,所以不用怀疑,update是java mongo driver里面的。<br>
         * update参数列表详细介绍请参考文档。<br>
         * 更新文档不覆盖原有字段只更新已有字段的关键在第二个参数,<br>
         * 需要使用mongo原生的$set修改器修改已经存在的字段,<br>
         * 创建不存在的字段,这样在原有的字段有值,而你新加的文档里面没有值的情况下也不会覆盖为空。
         */
        WriteResult result = mongoNsTemplate.getCollection("userStore")
                .update(query.getQueryObject(),
                        new BasicDBObject("$set", dbObject), true, false);

        System.out.println(result.getLastError());
        return result.getN() > 0;
    } catch (Exception e) {
    }
    return false;
}

你可能感兴趣的:(mongodb,更新文档,不覆盖)