1.生成自己的主键
在项目中,最好不要把"_id"当做业务主键,也不要依赖它作为插入时间排序的依据。
MongoDB在文档插入时,客户端默认会生成一个主键"_id",这个键的值可以是任何类型的,默认是个ObjectId对象,该对象前4个字节表示时间戳,这个时间戳是在mongo-driver生成的,并不是服务端的时间。
在一个集合里面,每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。但在不同的文档中"_id"的值可以相同。可以看见下图中两个集合中的记录拥有相同的"_id"。一般情况下,我们都希望我们的业务主键是全局唯一的。
基于以上原因,个人"_id"在项目中使用意义不大,因此在查询文档时,可以不返回这个字段。
db.collection.find( <query filter>, {"_id":1} )
3.不做Model映射
MongoDB的文档的存储形式是BSON,即Binary JSON。项目中前端和后端的数据交互也都是采用json的格式。在后端java程序中,我们并没有按照以往的做法将schema映射成java bean。我认为这样做损失了MongoDB schema free的灵活性。当我们的需求发生变动,需要修改或者增加字段时,只需要在前端做出字段的修改,然后以json的形式发送给后端,后端直接将json存入mongo集合即可,不用再去考虑修改哪个model/entity。