【问题标题】:MongoDB deletes all databases, besides admin config and localMongoDB 删除所有数据库,除了 admin config 和 local
【发布时间】:2020-04-21 21:27:24
【问题描述】:

我有一个问题。 我想将 MongoDB 与我的 Java Stuff 一起使用,但我不知道为什么它会不断删除除 admin、config 和 local 之外的所有其他数据库。我目前在我的本地服务器上使用它。我已经检查了我的代码,但那里没有删除。

我正在制作一个 minecraft 插件,它连接到数据库并创建 2 个集合。

好的,我找到了问题所在。数据库已创建,但由于其为空而立即被删除。但我想知道为什么,因为如您所见,我正在其中创建两个集合。

我不知道这是否重要,但我使用的是异步 mongodb java 驱动程序。

    private final String hostName;
private final String port;

private MongoClient client;
private MongoDatabase database;

private MongoCollection<Document> playerCollection, statsCollection;

public MongoManager(String hostName, String port) {
    this.hostName = hostName;
    this.port = port;
}

public void connect() {
    this.client = MongoClients.create(new ConnectionString(MessageFormat.format("mongodb://{0}:{1}", hostName, port)));

    this.database = this.client.getDatabase("prod");
    this.playerCollection = this.database.getCollection("players");
    this.statsCollection = this.database.getCollection("stats");
}

【问题讨论】:

  • 在您编写某些内容或显式运行 create 数据库命令之前,不会在服务器中实际创建集合。

标签: java mongodb asyncmongo


【解决方案1】:

getCollection 方法上指定的集合名称可能存在也可能不存在于 mongodb 上。如果集合不存在,MongoDB 会将其创建为写入操作的一部分。

【讨论】:

    【解决方案2】:

    在 MongoDB 中,当您创建一个集合或将一些数据插入到一个集合中时,就会创建一个数据库。这里有一些代码来证明这一点。

    (1) getDatabase 方法不会创建数据库,而是“获取”对名为testDB1 的数据库的访问权,不管它是否存在。如果数据库不存在,则不会创建它。如果它存在,您可以访问其中的任何现有集合。假设没有名为“testDB1”的数据库,下面的代码会创建一个数据库和一个集合。

    try(MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017/")) {
    
        MongoDatabase database = mongoClient.getDatabase("testDB1");
        database.createCollection("testColl");
    }
    

    (2) 通过将文档插入到该数据库的集合中来创建一个新数据库。

    MongoDatabase database = mongoClient.getDatabase("testDB2");
    MongoCollection<Document> coll = database.getCollection("testColl");
    
    Document newDoc = Document.parse("{ 'name': 'Mongo' }");
    coll.insertOne(newDoc);
    System.out.println(coll.find().first().toJson());
    

    注意:

    从 MongoDB Java 驱动程序 3.9 版开始,MongoDB Async Java Driver Documentation 表示基于回调的 Async Java 驱动程序已被弃用,取而代之的是 MongoDB Reactive Streams Java 驱动程序。

    【讨论】:

    • 在您插入文档之前不会创建集合和数据库(除非集合存在)。我希望它对你有用。
    【解决方案3】:

    好的,伙计们。 我真的很感谢所有试图回答我问题的人。 在我阅读了@prasad_ 的答案后,我的大脑终于又开始工作了。

    我记得 mongo-db 同步和异步 API 之间存在巨大差异。

    当您在同步 API 中执行 getDatabase() 时,如果它返回 null,它将自动为您创建。

    同步 API:

        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>LATEST</version>
            <scope>compile</scope>
        </dependency>
    

    异步 ​​API:

        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver-async</artifactId>
            <version>LATEST</version>
            <scope>compile</scope>
        </dependency>
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      相关资源
      最近更新 更多