对于我们的一位客户,我们必须根据客户提供的文件生成产品目录。到目前为止,我们已经通过Morphia将数据存储在MongoDB中,尽管现在正在切换到Spring-Data-MongoDB(版本2.0.9)。
为了跟踪对产品所做的更改,我们将产品的先前版本保存在一个单独的集合中,以便提供一些前后视图。为了避免代码重复,代码基本上是从实际产品继承的。我们同意将以前的版本存储长达90天,然后我们就有资格从数据库中删除它。
现在的问题是,先前在Morphia中将字段之一(lastChange
)指定为带有到期日的索引。由于PreviousProduct
从Product
继承了此字段,因此我们必须使用@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天后将被删除?