Spring Data MongoDB CompoundIndex的到期日期

时间:2018-11-23 14:01:33

标签: java spring-data-mongodb

对于我们的一位客户,我们必须根据客户提供的文件生成产品目录。到目前为止,我们已经通过Morphia将数据存储在MongoDB中,尽管现在正在切换到Spring-Data-MongoDB(版本2.0.9)。

为了跟踪对产品所做的更改,我们将产品的先前版本保存在一个单独的集合中,以便提供一些前后视图。为了避免代码重复,代码基本上是从实际产品继承的。我们同意将以前的版本存储长达90天,然后我们就有资格从数据库中删除它。

现在的问题是,先前在Morphia中将字段之一(lastChange)指定为带有到期日的索引。由于PreviousProductProduct继承了此字段,因此我们必须使用@CompoundIndex来创建索引。 Since Spring Data 1.6,但是,删除了在复合索引上定义到期时间戳的方法。

按代码显示,如下所示:

  

抽象基类:

@EqualsAndHashCode(exclude={"creationDate", "lastChange", "version"})
public abstract class MongoBaseEntity {

  @Id
  @Getter @Setter
  protected String id;

  @Getter
  @DiffIgnore
  protected Date creationDate;
  @Getter
  @DiffIgnore
  protected Date lastChange;

  @Version
  @DiffIgnore
  @Getter
  protected Long version;

  /**
   * Do not invoke. This method will be invoked by a custom {@link 
   * AbstractMongoEventListerner} listening for an {@link BeforeConvertEvent}
   */
  // @PrePersist
  public void prePersist() {
    creationDate = (creationDate == null) ? new Date() : creationDate;
    lastChange = (lastChange == null) ? creationDate : new Date();
  }

  @Override
  public abstract String toString();
}
  

产品类别

// @Entity(value = "product", noClassnamesStored = true)
// @Indexes(@Index(fields = @Field("ownerUuid")))
@Document(collection = "product")
@Getter
@Setter
public class Product extends MongoBaseEntity {

  private String ean; // european article number
  private String upc; // universal product code
  private string gpc; // gloabal product classification code
  @Indexed
  private String ownerUuid;
  private String ownerName;
  ...
}
  

PreviousProduct类

// @Entity(value = "product-prev", noClassnamsStored = true)
// @Indexes({
//   @Index(fields = @Field("lastChange"), options = @IndexOptions(expireAfterSeconds = 7775000)), // 90 days
//   ...
// })
@Document(collection = "product-prev")
@CompoundIndexes({
  @CompoundIndex(name = "expIdx_lastChange", def = "{ 'lastChange': 1 }"), // expireAfterSeconds = 7775000 (90 days)
  ...
}
@Getter
@Setter
@ToString
public class PreviousProduct extends ProductEntity {
  ...
}

为了清楚起见,我保留了以前的Morphia注释。还要注意,在以前的产品上有多个复合索引,尽管我将它们省略了,因为它们不是IMO问题的一部分。

我确实理解为什么删除了该字段的支持,因为当MongoDB only supports expiration on a single field only时,可能会试图在多个字段上指定一个到期时间戳,但是,在这种情况下,该到期仅应应用于单个字段。

那么,在这种情况下,如何在PreviousProduct上定义过期索引,以便存储在PreviousProduct中的文档在90天后将被删除?

0 个答案:

没有答案