gpt4 book ai didi

java - Morphia:在嵌入对象列表中搜索空值

转载 作者:行者123 更新时间:2023-11-29 06:42:38 26 4
gpt4 key购买 nike

我有一个嵌入式实体列表:

@Embedded
private List<EmbeddedEntity> embedded = new ArrayList<EmbeddedEntity>();

在此列表中,我想搜索任何具有特定属性(我们称它为 foo)但不是另一个(bar)的嵌入实体。所以 foo 应该是非空的,bar 在 Java 中应该是 null/在 MongoDB 中是不存在的。

我尝试了以下代码(我确实有包含列表的 Entity 的 UUID):

Query<Entity> query = mongoDataStore.find(Entity.class).field("uuid").equal(uuid)
.field("embedded.foo").exists()
.field("embedded.bar").doesNotExist();

如果列表为空或只有一个条目(其中 foo 有一个值而 bar 尚不存在),这将正常工作。但是只要任何 bar 属性具有值,查询就会返回错误的结果。所以我正在寻找一个查询,它遍历所有嵌入的实体并在任何丢失的 bar 上触发。这可能吗?

示例数据:

// the query does not pick up the entity as it doesn't have a foo -
// that's what I want
{ uuid: "...", [ { embedded: } ] }

// the query picks up the entity as there is a foo but no bar -
// that's what I want
{ uuid: "...", [ { embedded: { foo: date } } ] }

// the query does not pick up the entity - that's not what I want
// as one foo has a value and its bar doesn't
{ uuid: "...", [ { embedded: { foo: date, bar: date } },
{ embedded: { foo: date } }
] }

PS:我用 .field("embedded.bar").hasThisOne(null) 得到了相同的结果。

PPS:手动遍历列表元素并不是真正的选择,因为我想使用查询进行更新操作。

PPS:我认为这是 Morphia 中的一个错误 - 请参阅下面我的回答 (https://stackoverflow.com/a/9705175/573153) 以获取解决方法

最佳答案

我找到了解决方法。虽然我似乎无法查询 null,但我可以查询特定值。

在我的例子中,bar 字段是一个日期。因此,我可以使用 private Date bar = new Date(0) 初始化实体 - 在我的情况下,这显然是一个无效日期,从未使用过。所以查询看起来像这样:

Query<Entity> query = mongoDataStore
.find(Entity.class)
.field("uuid").equal(uuid)
.field("embedded.foo").exists()
.field("embedded.bar").hasThisOne(new Date(0));

如果有人需要它,这里是更新操作(您需要禁用验证,因为 .$. 否则会引发错误):

UpdateOperations<Entity> update = mongoDataStore
.createUpdateOperations(Entity.class)
.disableValidation()
.set("embedded.$.bar", new Date());

mongoDataStore.update(query, update);

关于java - Morphia:在嵌入对象列表中搜索空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9660684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com