您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Mongodb用String自定義ID”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Mongodb用String自定義ID”吧!
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<Object> { @Override public void onBeforeSave(BeforeSaveEvent<Object> 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()); } } }
通過監(jiān)聽器 , 保存的時(shí)候,把 ObjectId 類型的id都轉(zhuǎn)成 Stirng, 如果是空的,就自己加一個(gè)String類型的id.
But 有一個(gè)問題, 查詢,或者刪除的時(shí)候, 如果String 字符串是一個(gè)合法的 ObjectId 的形式。 Spring Data Mongo 會(huì)自動(dòng)轉(zhuǎn)成 ObjectId 去查詢或刪除。
這樣就找不到記錄了。
https://stackoverflow.com/questions/14329175/prevent-spring-data-for-mongo-to-convert-ids-to-objectid
這里介紹的一個(gè)方式是 拋異常, 還沒試過。 看著拋異常就不太想用。
public class CustomMongoConverter extends MappingMongoConverter { public CustomMongoConverter(MongoDbFactory mongoDbFactory, MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext) { super(mongoDbFactory, mappingContext); conversionService.addConverter(new Converter<String, ObjectId>() { @Override public ObjectId convert(String source) { throw new RuntimeException(); } }); } }
還沒結(jié)束, 估計(jì)要放棄的節(jié)奏,就用 ObjectId 當(dāng)主鍵。
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<Object> { @Override public void onBeforeSave(BeforeSaveEvent<Object> 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())*/); } } }
之前一個(gè)項(xiàng)目用了 ObjectId ,感覺沒啥用。 還容易出錯(cuò)。 比如前臺(tái)傳的String, 查詢的時(shí)候忘記轉(zhuǎn)為 ObjectId了...
最后,反正是不用 ObjectId了, 只要 String 不符合 ObjectId spring 就不會(huì)自動(dòng)轉(zhuǎn)換, 建議就用 UUID字符串 替代。這樣查詢刪除也沒問題。
或者加一個(gè)字符串,改變長度就行。
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看一下, 他這個(gè)轉(zhuǎn)換的判斷邏輯是啥,
判斷邏輯就是是不是合法的 ObjectId.
到此,相信大家對“Mongodb用String自定義ID”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。