Mongodb 从文档中删除DBRef
我有一个实体组Mongodb 从文档中删除DBRef,mongodb,morphia,nosql,Mongodb,Morphia,Nosql,我有一个实体组 @Entity("Group") public class Group implements Serializable{ @Id public ObjectId id; public String name; public List<Students> studentsList; } 如何将学生从小组中移除? 我试过这样的方法: public void deleteStudent(String groupId, Student student) { Group gr
@Entity("Group")
public class Group implements Serializable{
@Id
public ObjectId id;
public String name;
public List<Students> studentsList;
}
如何将学生从小组中移除?
我试过这样的方法:
public void deleteStudent(String groupId, Student student) {
Group group = dataStore().find(Group.class,"_id",new ObjectId(groupId)).get();
List<Students> studentList = group.getStudentList();
studentList.remove(student);
dataStore().save(group); //doesn't work
dataStore().merge(group); //doesn't work
dataStore().delete(student); //works but causes issue cause DBref in Group still exists
}
public void delete Student(字符串groupId,Student-Student){
Group Group=dataStore().find(Group.class,“_id”,new ObjectId(groupId)).get();
List studentList=group.getStudentList();
学生列表。删除(学生);
dataStore().save(group);//不起作用
dataStore().merge(group);//不起作用
dataStore().delete(student);//可以工作,但会导致问题。组中的原因DBref仍然存在
}
MongoDB中没有级联删除
您需要手动从列表/集合中删除引用。使用list.remove(xxx)
和datastore.save(entity)
通常可以工作。您能否调试IDE中的代码并检查Java代码是否真的删除了学生引用
一旦这样做了,MongoDB中的save也应该可以使用。这肯定可以使用(我经常使用它) 我能想到几个原因:
getStudentList()
方法正在返回集合的副本,
而不是潜在的联系hashCode()
和equals()
,因此删除与您的组对象不匹配deleteStudion
后保存该组对象,这将重写studentList的旧版本,而该旧学生仍在那里为什么
保存(组)
不起作用?1) 那学生后来还在名单上吗?2) 您确定您的remove(student)
按预期工作吗?Save(group)不工作,因为在执行操作后,我使用MongoExplorer检查了文档,发现组中的dbRef仍然存在。我认为remove(student)的工作原理应该是将student从“student”集合中删除。据我所知,morphia不支持cascade之类的东西。这就是为什么组文档中的dbRef是左的。没有级联删除。因此,您需要手动从列表/集合中删除引用。使用list.remove(xxx)
和datastore.save(entity)
通常可以工作。你能调试IDE中的代码并检查Java代码是否真的删除了学生参考吗?现在检查一下。你是对的。Java不从列表中删除学生引用。操作列表。删除(dbRef)根本不起作用。很好。我添加了这个评论作为回答。如果遇到任何其他问题,请随时更新问题。一旦删除在Java中起作用,MongoDB存储就应该做您想要做的事情?如果studentList
是组的字段,那么studentList.remove(student)
应该可以工作,如果student确实在那里。尤其是因为他保存了组对象;Morphia将在保存期间将列表转换为相应的JSON。在关系数据库中进行级联:表X中的一行与表Y中的一行具有外键关系。如果FK设置为on delete cascade,则删除表X中的行也将删除Y中引用的键。在具有DBRefs的MongoDB中不存在此概念,这基本上是大多数驱动程序实现的FKs的约定
public void deleteStudent(String groupId, Student student) {
Group group = dataStore().find(Group.class,"_id",new ObjectId(groupId)).get();
List<Students> studentList = group.getStudentList();
studentList.remove(student);
dataStore().save(group); //doesn't work
dataStore().merge(group); //doesn't work
dataStore().delete(student); //works but causes issue cause DBref in Group still exists
}