Java 如何从morphia中的ArrayList中删除特定元素?

Java 如何从morphia中的ArrayList中删除特定元素?,java,mongodb,playframework,morphia,Java,Mongodb,Playframework,Morphia,我在Morphia实体类中使用ArrayList的继承@Embedded引用 @Entity public class First { @Embedded private List<Second> secondClass; private String title; private Long id; ... getter and setter .. methods } @Embedded public class Second { @Embedded priv

我在Morphia
实体
类中使用ArrayList的继承
@Embedded
引用

@Entity
public class First {
  @Embedded private List<Second> secondClass;
  private String title;
  private Long id;
  ...  getter and setter .. methods
}

@Embedded
public class Second {
  @Embedded private List<Third> thirdClass;
  private String titleSecond;
  ...  getter and setter .. methods
}

@Embedded
public class Third {
  private String titleThird;
  private String logoUrl
  ...  getter and setter .. methods
}
问题 1) 如何删除给定值为
titleSecond
id
的元素

2) 如何删除给定值为
titleThird
id
的元素

首先,我尝试了以下实现:

UpdateOperations<First> ops;
Query<First> updateQuery = datastore.createQuery(First.class).filter("id", Long.parseLong(id.trim()));

ops = datastore.createUpdateOperations(First.class).disableValidation().removeAll("secondClass.titleSecond", "Developer");
datastore.update(updateQuery, ops);
如何执行问题1和2的操作?任何帮助都是值得的


可能是链接问题:

创建了这样的记录

db.myCollection.insertMany([{
        "_id" : ObjectId("58609ed483ce6037ec33fc8c"),
        "secondClass" : [
                {
                        "thirdClass" : [
                                {
                                        "titleThird" : "Java",
                                        "logoUrl" : "http://www.artsfon.com/pic"
                                },
                                {
                                        "titleThird" : "ios",
                                        "logoUrl" : "http://www.artsfon.com/pic"
                                }
                        ],
                        "titleSecond" : "Developer"
                }
        ],
        "title" : "Software Developer"
}])
我的第一节课。其余的课程都一样

@Entity("myCollection")
public class First {

    @Id
    private ObjectId id;
    private String title;
    @Embedded
    private List<Second> secondClass;
@实体(“myCollection”)
头等舱{
@身份证
私有ObjectId;
私有字符串标题;
@嵌入
二等私人名单;
对第一部分的答复

UpdateOperations<First> ops;
Query<First> updateQuery = datastore.createQuery(First.class).field("_id").equal(new ObjectId("58609ed483ce6037ec33fc8c"));

Second second = new Second();
second.setTitleSecond("Developer");
ops = datastore.createUpdateOperations(First.class).disableValidation().removeAll("secondClass", second);
datastore.update(updateQuery, ops);
UpdateOperations<First> ops;
Query<First> updateQuery = datastore.createQuery(First.class).field("_id").equal(new ObjectId("58609ed483ce6037ec33fc8c"));

ops = datastore.createUpdateOperations(First.class).disableValidation().removeAll("secondClass", new BasicDBObject("titleSecond", "Developer"));
datastore.update(updateQuery, ops);
更新操作ops;
Query updateQuery=datastore.createQuery(First.class).field(“_id”).equal(新ObjectId(“58609ed483ce6037ec33fc8c”);
第二秒=新的第二秒();
第二,设置标题第二(“开发者”);
ops=datastore.createUpdateOperations(First.class).disableValidation().removeAll(“secondClass”,second);
数据存储更新(updateQuery,ops);
第一部分的替代解决方案

UpdateOperations<First> ops;
Query<First> updateQuery = datastore.createQuery(First.class).field("_id").equal(new ObjectId("58609ed483ce6037ec33fc8c"));

Second second = new Second();
second.setTitleSecond("Developer");
ops = datastore.createUpdateOperations(First.class).disableValidation().removeAll("secondClass", second);
datastore.update(updateQuery, ops);
UpdateOperations<First> ops;
Query<First> updateQuery = datastore.createQuery(First.class).field("_id").equal(new ObjectId("58609ed483ce6037ec33fc8c"));

ops = datastore.createUpdateOperations(First.class).disableValidation().removeAll("secondClass", new BasicDBObject("titleSecond", "Developer"));
datastore.update(updateQuery, ops);
更新操作ops;
Query updateQuery=datastore.createQuery(First.class).field(“_id”).equal(新ObjectId(“58609ed483ce6037ec33fc8c”);
ops=datastore.createUpdateOperations(First.class).disableValidation().removeAll(“secondClass”,新的BasicDBObject(“titleSecond”,“Developer”);
数据存储更新(updateQuery,ops);
对第二部分的答复

UpdateOperations<First> ops;
Query<First> updateQuery = datastore.createQuery(First.class).field("_id").equal(new ObjectId("58609ed483ce6037ec33fc8c")).field("secondClass.thirdClass.titleThird").equal("ios");

ops = datastore.createUpdateOperations(First.class).disableValidation().removeAll("secondClass.$.thirdClass", new BasicDBObject("titleThird", "ios"));
datastore.update(updateQuery, ops);
更新操作ops;
Query updateQuery=datastore.createQuery(First.class).field(“_id”).equal(新ObjectId(“58609ed483ce6037ec33fc8c”)).field(“secondClass.thirdClass.titleThird”).equal(“ios”);
ops=datastore.createUpdateOperations(First.class).disableValidation().removeAll(“secondClass.$.thirdClass”,新的BasicDBObject(“titleThird”,“ios”);
数据存储更新(updateQuery,ops);

只是好奇你是如何创建这些文档的?你能将记录推到第三类吗?单独的问题。第二类是如何与第三类绑定的?你能将第三类移动到与第二类相同的级别吗?只是好奇你是如何创建这些文档的?我正在通过上面的
JSON
object并使用
datastore.save(firstObject)
*您是否能够将记录推送到第三类*:是的,我可以在
MongoDB
中看到记录*第二类与第三类的联系如何*:我在
第二类中使用了
@嵌入私有列表thirdClass;
。请查看发布的JSON(`thirdClass':[{…}]`.*你能把第三节课移到和第二节课相同的高度吗*事实上,我不能:(.请务必让我知道我是否已经清除了您的所有问题?实际上这不是关于第一次保存。我的问题是,如果您想在现有对象的第三类中添加一个新条目,该怎么办?您是否已经尝试过了?还没有,我必须。如果我在
secondClasssecondClass,会不会出现类似的情况>?让我先尝试实现您的解决方案。好的。我认为这不一样。至少在尝试删除第三类中的条目时,我无法绕过这一点。我将让您尝试推到第三类中。我没有尝试过这一部分。我尝试过,但什么都没有发生。得到了成功的响应,无一例外。我检查了数据库,但e条目就在那里。你想让我找到
标题second
,把它拿到
removeAll(“secondClass”,second
),还是我只需要复制你的代码?添加了完整的代码。这将帮助你更好地理解。还添加了答案的第二部分。我正在使用Morphia 1.3.0 Hanks sagar,“第一部分的替代解决方案”“第二部分的答案”的标题对我来说很有用