【问题标题】:mongodb collections are created without any documents in it创建 mongodb 集合时没有任何文档
【发布时间】:2012-12-14 09:11:57
【问题描述】:

所以我的问题是在我的生产数据库中自动创建旨在包含临时数据的集合(但从逻辑上讲永远不会填充任何这些临时文档)。为什么会这样,我该如何避免这种行为?

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

productiveDB.coll1
productiveDB.coll2

temporaryDB.col3
temporaryDB.col4

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

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

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

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;
    }
}

【问题讨论】:

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


    【解决方案1】:

    目前这是不可能的。 MongoDB 中的集合在写入后会延迟创建,当它们为空时不会自动删除。有几个开放的 JIRA 问题或与之相关的行为,特别是:

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

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

    您将不得不手动清理空集合。定期扫描所有数据库以查找空集合并删除它们(可选地,仅当集合名称以特定字符串为前缀时,例如“temp”)可以解决问题。

    【讨论】:

    • 这不是我真正想知道的。创建集合时没有保存任何文档。
    • 严格来说并非如此。您将对集合(索引)数据执行写入操作,即执行 ensureIndex 调用。
    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 2015-07-20
    • 2018-04-04
    • 2023-03-11
    • 2012-10-07
    • 1970-01-01
    • 2015-07-05
    • 2021-08-04
    相关资源
    最近更新 更多