Mongo中_id与java实体类中对应关系

_id作为mongo数据库中集合里面每个文档的唯一标识,我们在java中进行增删改查操作中有时候不可避免的需要使用到。但是_id在文档中的定义类型为Objectid类型,那我们在java实体类中又该建立何种类型与之对应呢?

直接新建属性id,类型为String就可以进行操作,增删改成是也能自动转换为_id
实体类:

@Data
@ApiModel(value="mongoId的测试类")
@Document(collection = "test_mongoId")
@Component
public class TestMongoId {
    private String id;
    private String name;
    private int age;
}

dao层实现类:

@Repository(value = "TestMongoIdDaoImpl")
public class TestMongoIdDaoImpl implements TestMongoIdDao {

    @Resource
    private MongoTemplate mongoTemplate;

    @Override
    public void addTest(TestMongoId testMongoId) {
        MongoCollection<Document> sensorType = mongoTemplate.getCollection("test_mongoId");
        sensorType.insertOne(Document.parse(JSON.toJSONString(testMongoId)));
    }

    @Override
    public List<TestMongoId> findAll() {
        List<TestMongoId> mongoIds = mongoTemplate.findAll(TestMongoId.class, "test_mongoId");
        return mongoIds;
    }

    @Override
    public TestMongoId findByMongoId(String _id) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(_id));
        TestMongoId testMongoId = mongoTemplate.findOne(query, TestMongoId.class);
        return testMongoId;
    }

    @Override
    public boolean updateByMongoId(String _id,TestMongoId testMongoId) {
        Document query = new Document();
        query.append("_id", _id);
        Document document = Document.parse(JSON.toJSONString(testMongoId));
        UpdateResult updateResult =  mongoTemplate.getCollection("test_mongoId").updateOne(query, new Document("$set",document));
        return updateResult.getModifiedCount()>0;
    }

    @Override
    public boolean deleteByMongoId(String _id) {
        Document query = new Document();
        query.append("_id", _id);
        return  mongoTemplate.getCollection(CollectionNameEnum.SENSORTYPEORDER.getValue()).deleteOne(query).getDeletedCount()>0;
    }
}

测试类:


@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMongoIdDaoImplTest {
    @Resource(name= "TestMongoIdDaoImpl")
    private TestMongoIdDao testMongoIdDaoImpl;
    @Test
    public void addTest() {
        TestMongoId testMongoId = new TestMongoId();
        testMongoId.setId("1234564556");
        testMongoId.setAge(22);
        testMongoId.setName("徐渭虎");
//        testMongoId.setName("徐风年");
//        testMongoId.setAge(18);
        testMongoIdDaoImpl.addTest(testMongoId);
    }
    @Test
    public void findAll() {
        List<TestMongoId> all = testMongoIdDaoImpl.findAll();
        System.out.println("all: " + all);
    }

    @Test
    public void findByMongoId() {
        TestMongoId byMongoId = testMongoIdDaoImpl.findByMongoId("5d48e1a9cfc95a068c6def21");
        System.out.println("byMongoId: " + byMongoId);
    }
    }

测试结果:
添加:
数据库中:
在这里插入图片描述
查询:可以看到查询出来的id是数据库中的_id,而不是我们添加时设置的id,感觉这里应该是有个自动转换,我们自己设置的id好像无效,具体是啥原因暂时还不是很理解
在这里插入图片描述

如果将实体中的id改成_id结果依然一样。

@Data
@ApiModel(value="mongoId的测试类")
@Document(collection = "test_mongoId")
@Component
public class TestMongoId {
    private String _id;
    private String name;
    private int age;
}

添加:

    @Test
    public void addTest() {
        TestMongoId testMongoId = new TestMongoId();
        testMongoId.set_id("1234564556");
//        testMongoId.setAge(22);
//        testMongoId.setName("徐渭虎");
        testMongoId.setName("徐风年");
        testMongoId.setAge(18);
        testMongoIdDaoImpl.addTest(testMongoId);
    }

结果:在这里插入图片描述
查询:
在这里插入图片描述
综上所述:mongo数据库文档里面ObjectId类型的_id可以在java实体中建立String类型的_id或id来与之对应,但是我们无法对实体中建立的id进行操作,因为它会被数据库中_id覆盖掉。当然如果你是自己建立id不是想当成ObejectId来使用,还是可以的,那就和name,age等一样了,只是名称问题。所以这里就不需要杠精来抬杠了。大概的意思能懂就行。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值