创建mongodb集合时没有任何文档

时间:2012-12-14 09:11:57

标签: mongodb spring-data spring-data-mongodb

所以我的问题是在我的高效数据库中自动创建集合意味着包含临时数据(但逻辑上从来没有填充任何这些临时文档)。为什么会这样,我怎么能避免这种行为?

例如,一个更正式的解释,我有两个数据库 - 以及它们包含的集合

productiveDB.coll1
productiveDB.coll2

temporaryDB.col3
temporaryDB.col4

但是当我开始存储数据时,spring会自动创建

productiveDB.coll1
productiveDB.coll2
productiveDB.col3
productiveDB.col4

对于记录:我已经在使用1.1.1.RELEASE了。我创建了一个小的测试用例,其中重现了这种行为:两个文档(MyDocOne和MyDocTwo)在自定义字段上包含@Indexed注释 - 它们还包含object类型的字段。所以当我创建实体myDocOne and myDocTwo - 设置myDocTwo.obj = myDocOne并坚持myDocTwo时 - spring会在myDocOne中创建一个集合template2 ...这有点令人困惑 - 我希望以下代码能够提供更好的概述。

public static void main(String[] args ) {
    App app = new App();
    ApplicationContextLoader loader = new ApplicationContextLoader();
    loader.load(app, "applicationContext.xml");

    MongoTemplate template1;
    MongoTemplate template2;

    try {
        template1 = new MongoTemplate(new Mongo("localhost"), "tmp1");
        template1.setApplicationContext(loader.getApplicationContext());
        template2 = new MongoTemplate(new Mongo("localhost"), "tmp2");
        template2.setApplicationContext(loader.getApplicationContext());
        MyDocOne one = new MyDocOne("foo", "bar");
        template1.save(one);            
        MyDocTwo two = new MyDocTwo("foo", "baz");
        two.setAny(one);
        template2.save(two);

    } catch (Exception e) {
            e.printStackTrace();
    }
}

和文件:

@Document
public class MyDocOne {

    @Indexed
    String a;
    String b;

    public MyDocOne(String a, String b) {
        super();
        this.a = a;
        this.b = b;
    }
}

@Document
public class MyDocTwo {
    @Indexed
    String a;
    String b;
    Object any;

    public MyDocOne(String a, String b) {
        super();
        this.a = a;
        this.b = b;
    }

    public void setAny(Object any) {
        this.any = any;
    }
}

1 个答案:

答案 0 :(得分:2)

目前无法做到这一点。 MongoDB中的集合在写入时会立即创建,并且在它们变空时不会自动删除。有几个与此相关的开放JIRA问题或与之相关的行为,具体而言:

https://jira.mongodb.org/browse/SERVER-610

https://jira.mongodb.org/browse/SERVER-3215

您必须手动清理空集合。一个定期传递,它扫描所有数据库中的空集合并删除它们(可选地,只有当集合名称以特定字符串作为前缀时,例如“temp”)才能完成。