mongodb基础知识-修改字段名称

    最近两天,由于mongo驱动版本的问题,导致系统不兼容,填了几天坑,终于填完了,但是并没有熊根本上解决问题。后面决定要进行一次大重构,增加一个dao层,后台的mvc架构,以前觉得dao和service的很多工作重复,经过这个以后,才发现dao层确实很有必要,不过service和dao层的数据交换格式千万不要用mongo驱动自带的,mongo2.x以前用的是DBobject, 3.x以后又写了一个Document,当然3.x还是可以用Dbobject,并且也提供了转换为Document'的方法,但是这并不是官方的推荐形式,这只能怪mongo官方一开始没有确定好数据交换的类型,所以最好在service和dao之间的数据交换使用jdk自带的类或者我们自己创建的类,最好不要用第三方的类来作为数据交换格式。

    如果遇到数据底库层切换,只需要更改dao层,从新写一个就行了,其他所有的业务层都不需要更改,我就是因为之前懒得写dao,直接在service层操作mongo,导致mongo切换时修改很多的service实现。

    最后说说最近用到的一个mongo操作,网上搜了一下,找到了解决方案。其实要实现的功能就是把字段改名,我一开始没有注意到官方文档中一个操作符可以实现这个功能,就自己来修改,简单暴力,先把原来字段的值,设置到新字段,然后删除原来的字段,结果看到官方$rename说明时,内部也是差不过这个实现方式。

    1.把一个字段的值复制到一个新字段上:

// 第三个参数false表示文档不存在是否新增, 默认false
// 第四个参数true表示是否更新满足条件的所有文档, 默认false
db.coll_name.find({}).forEach(
     function(doc) {
        db.coll_name.update({"_id" : doc._id}, {"set" : {"new_filed" : doc.old_field}}, false, true);
     }
);

//

    2.删除字段

// 删除字段的语法是
{ $unset: { <field1>: "", ... } }

// 比如删除一个name字段
db.coll_name.update({"_id" : 1}, {"$unset": { "name": ""}}, false, false);
db.coll_name.update({"_id" : 1}, {"$unset": { "name": "无所谓"}}, false, false);
// 这两种方式都是可以得,就是说要删除的字段你设置值不会影响删除字段的操作

    3.修改字段名

db.coll_name.update({}, {"$rename": { "old_field": "new_field"}}, false, true);

相关推荐