_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等一样了,只是名称问题。所以这里就不需要杠精来抬杠了。大概的意思能懂就行。