Java 使用位置运算符更改MongoDB 2.6

Java 使用位置运算符更改MongoDB 2.6,java,mongodb,morphia,Java,Mongodb,Morphia,我有一个(Morphia)实体,它嵌入了另一个实体: @Entity(value = "connection", noClassnameStored = false) public class ConnectorEntity { @Embedded private List<UnavailabilityEntity> unavailabilities = new ArrayList<>(); 添加不可用项可以很好地工作。因此,有一个不可用实体的列表,如果

我有一个(Morphia)实体,它嵌入了另一个实体:

@Entity(value = "connection", noClassnameStored = false)
public class ConnectorEntity {
    @Embedded
    private List<UnavailabilityEntity> unavailabilities = new ArrayList<>();
添加不可用项可以很好地工作。因此,有一个不可用实体的列表,如果某些实体当前不可用,则其中一个具有
end=newdate(0)

一旦连接器再次可用,我想通过设置
end=new Date()
来“关闭”不可用性

以下查询在MongoDB 2.4中运行良好,但在2.6中不起作用,如果我想添加第二个不可用性(添加并关闭一个不可用性即可):

@覆盖
public void addAvailability(最终字符串connectionUID){
Query Query=mongoDataStore.find(ConnectorEntity.class)
.field(“uuid”).equal(ConnectionUID)
.field(“unavailabilities.start”).exists()
.field(“unavailabilities.end”).hasThisOne(新日期(0));
//如果存在开放的不可用性-关闭它
if(query.get()!=null){
UpdateOperations update=mongoDataStore
.createUpdateOperations(ConnectorEntity.class).disableValidation()
.set(“不可用.$.end”,新日期());
更新(查询,更新);
}
}

因此,我假设位置运算符
$
未应用于正确的不可用性。MongoDB中是否有我不知道的更改?

也许您可以在
mongod
2.4
2.6
上启用,并比较生成的查询?您解决了查询问题了吗?如果唯一改变的是您的MongoDB服务器版本,那么在MongoDB 2.6和2.4中,查询的处理方式可能会有所不同,因此需要分析/解释正在生成的特定查询。如果您更改了任何其他内容(例如,正在查询不同的数据集或使用不同的Morphia版本),这使得隔离问题变得更加困难。我只更改了MongoDB版本,没有其他更改。我将在几周后再试一次,但升级目前对我们来说并不紧迫,因此需要一些时间
@Embedded
public class UnavailabilityEntity implements Serializable {
    private Date start = new Date();
    // Do not use a null value as Morphia (as of 0.99.1) cannot handle this on embedded lists
    private Date end = new Date(0);
@Override
public void addAvailability(final String connectionUuid) {
    Query<ConnectorEntity> query = mongoDataStore.find(ConnectorEntity.class)
        .field("uuid").equal(connectionUuid)
        .field("unavailabilities.start").exists()
        .field("unavailabilities.end").hasThisOne(new Date(0));

    // If there is an open unavailability - close it
    if (query.get() != null) {
        UpdateOperations<ConnectorEntity> update = mongoDataStore
            .createUpdateOperations(ConnectorEntity.class).disableValidation()
            .set("unavailabilities.$.end", new Date());
        mongoDataStore.update(query, update);
    }
}