189 8069 5689

Mongodb用String自定义ID

本篇内容主要讲解“MongoDB用String自定义ID”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Mongodb用String自定义ID”吧!

我们提供的服务有:成都网站建设、做网站、微信公众号开发、网站优化、网站认证、沂水ssl等。为成百上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的沂水网站制作公司

import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent;
import org.springframework.stereotype.Component;

@Component
public class BeforeConvertListener extends AbstractMongoEventListener {
    @Override
    public void onBeforeSave(BeforeSaveEvent event) {
        Document d = event.getDocument();
        if(d==null){  //不太可能
            return;
        }
        Object _id = d.get("_id");
        if (_id == null) {
            event.getDocument().put("_id", new ObjectId().toString());
        } else if (_id instanceof ObjectId) {
            event.getDocument().put("_id", _id.toString());
        }
    }
}

通过监听器 , 保存的时候,把 ObjectId 类型的id都转成 Stirng, 如果是空的,就自己加一个String类型的id.

But 有一个问题, 查询,或者删除的时候, 如果String 字符串是一个合法的 ObjectId 的形式。 Spring Data Mongo 会自动转成 ObjectId 去查询或删除。

这样就找不到记录了。

https://stackoverflow.com/questions/14329175/prevent-spring-data-for-mongo-to-convert-ids-to-objectid

这里介绍的一个方式是 抛异常, 还没试过。 看着抛异常就不太想用。 

public class CustomMongoConverter extends MappingMongoConverter {
    public CustomMongoConverter(MongoDbFactory mongoDbFactory, MappingContext, MongoPersistentProperty> mappingContext) {
        super(mongoDbFactory, mappingContext);
        conversionService.addConverter(new Converter() {
            @Override
            public ObjectId convert(String source) {
                throw new RuntimeException();
            }
        });
    }
}

还没结束, 估计要放弃的节奏,就用 ObjectId 当主键。 

import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.StrUtil;
import org.bson.Document;
        import org.bson.types.ObjectId;
        import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
        import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
        import org.springframework.data.mongodb.core.mapping.event.BeforeSaveEvent;
        import org.springframework.stereotype.Component;

@Component
public class BeforeConvertListener extends AbstractMongoEventListener {
    @Override
    public void onBeforeSave(BeforeSaveEvent event) {
        Document d = event.getDocument();
        if(d==null){  //不太可能
            return;
        }
        Object _id = d.get("_id");
        if (_id == null) {
            event.getDocument().put("_id", UUID.fastUUID().toString()/*StrUtil.reverse(new ObjectId().toString())*/);
        } else if (_id instanceof ObjectId) {
            event.getDocument().put("_id",  UUID.fastUUID().toString()/* StrUtil.reverse(_id.toString())*/);
        }
    }
}

之前一个项目用了 ObjectId ,感觉没啥用。 还容易出错。 比如前台传的String, 查询的时候忘记转为 ObjectId了...

最后,反正是不用 ObjectId了, 只要 String 不符合 ObjectId spring 就不会自动转换, 建议就用 UUID字符串 替代。这样查询删除也没问题。

或者加一个字符串,改变长度就行。

 Object _id = d.get("_id");
        if (_id == null) {
            event.getDocument().put("_id", new ObjectId().toString()+"c");
        } else if (_id instanceof ObjectId) {
            event.getDocument().put("_id",  _id.toString()+"c");
        }

debug看一下, 他这个转换的判断逻辑是啥,

判断逻辑就是是不是合法的 ObjectId.

Mongodb用String自定义ID

到此,相信大家对“Mongodb用String自定义ID”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网站标题:Mongodb用String自定义ID
当前网址:http://cdxtjz.cn/article/jggeso.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。