如何在mongo文档中将java.util.Date用作@Id

时间:2019-07-02 13:48:42

标签: spring mongodb spring-boot

好吧,我发现自己遇到了一个简单但烦人的问题。我的mongo文档使用java.util.Date作为ID,您可能会猜到ID已被转换(弹簧转换器)为ObjectId,所以我无法更新这些文档,因为每次创建新的ObjectId(Date)时都会获得一个完全即使日期相同,ID也不同...

我如何强制mongo仅使用java.util.Date作为ID?

提供示例代码:

  public void updateNode(...node..) {
    final MongoTemplate mongoTemplate = ...
    final String collectionName = ...
    final Query query = (new Query()).addCriteria(Criteria.where("time").is(node.getTime()));
    final Update update = Update.update("time", node.getTime()).set("top", node.getTop())
          .set("bottom", node.getBottom()).set("mid", node.getMid())
          .set("startTime", node.getStartTime()).set("potential", node.isPotential());

    mongoTemplate.upsert(query, update, MyClassNode.class, collectionName);



  }

如果我是第一次运行此代码,则将对象插入到数据库中,但是使用ObjectId ...如果node.getTime()是java.sql.Date,那么一切都很好。

如果node.getTime()不是java.sql.Date,则无法更新文档(如果存在):为什么?因为每次准备文档时都会创建一个新的ObjectId,所以更新和查询将具有两个不同的_id字段值,并且更新失败。

1 个答案:

答案 0 :(得分:0)

在检查文档时,我发现了以下详细信息:

  

在MongoDB中,存储在集合中的每个文档都需要一个唯一的_id   充当主键的字段。如果插入的文档省略了   _id字段,MongoDB驱动程序会自动为_id字段生成一个ObjectId。

     

这也适用于通过更新操作插入的文档   upsert:是的。

以下是用于存储_id值的常用选项:

  • 使用ObjectId。
  • 使用自然唯一标识符(如果有)。这样可以节省空间,并且 避免附加索引。
  • 生成一个自动递增的数字。

我从文档中了解到,为避免多次插入同一文档,请仅在查询字段具有唯一索引的情况下使用upsert: true。因此,如果设置了此标志,则会发现您的ID已转换使用ObjectId()使它唯一。