Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 从文档中删除DBRef_Mongodb_Morphia_Nosql - Fatal编程技术网

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
    }