欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-20 17:37:10
...

    最近两天,由于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);