使用Java MongoDB驱动程序连接到MongoDB并执行文档的CRUD操作

Java MongoDB驱动程序是什么。 

这是一个用于访问指定MongoDB并处理其数据的Java驱动程序。还有一个BSON库(主要用于MongoDB的二进制JSON格式)。

下载jar文件在公式的Github上,可以下载包括历史版本在内的软件。如果使用Maven,只需要将其添加到pom文件中,非常方便。(不是为了做广告)

<dependencies>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.3.0</version>
    </dependency>
</dependencies>

或者使用Gradle。

dependencies {
   compile 'org.mongodb:mongo-java-driver:3.3.0'
}

连接连接将按照以下步骤进行配置。

创建客户创建客户端的设置如下:
可以通过指定 host 和 port 作为参数,或者指定服务器地址。
请根据您的 MongoDB 环境进行配置。

以下是一个例子。更详细的信息请参考http://api.mongodb.com/java/2.10.1/com/mongodb/MongoClient.html

//基本形
MongoCliant cliant = new MongoCliant();


//hostとport設定
String host = "localhost";
int port = 27017;
MongoCliant cliant = new MongoCliant(host, port);


//複数のサーバーを対象としたアクセスの場合
ServerAddress primary = new ServerAddress("hoge", port);
ServerAddress secondary = new ServerAddress("fuga", port);
List<ServerAddress> addressArr = new ArrayList<>(Arrays.asList(primary, secondary));

MongoCliant cliant = new MongoCliant(addressArr);

如果在多个数据库中设置了冗余配置,例如设置了副本集,通过像下面这样的设置,它会自动选择要连接的数据库。顺便提一句,ServerAddress也是MongoDB驱动程序API之一,就像在创建MongoClient时一样,可以通过指定主机名、端口等来创建它。

获取DB和collection通过客户端获取数据库和集合。
※在MongoDB中,把表称为“集合”。

//DB取得
String databaseName = "dbname";
MongoDatabase database = cliant.getDatabase(databaseName);

//collection取得
String collectionName = "collection";
MongoCollection<Document> coll = mongoDb.getCollection(collectionName);

现在,已经准备好访问文档了。

閱讀偏好設置我已在这里写下了:
http://qiita.com/ricoirico/items/3d83baba6c191806f097

在创建或创建后MongoCollection实例或MongoDatabase实例时,一般会附加设置。

阅读获取或检索集合中的文档。

获取文档数量以long类型返回。

long cnt = coll.count();

System.out.println(cnt);

获取所有文件

String doc = "";
FindIterable<Document> iterator = coll.find();
MongoCursor cursor = iterator.iterator();

while(cursor.hasNext()){
     doc += cursor.next();
     doc += System.getProperty("line.separator");
}

System.out.println(doc); //出力例: Document{{_id=582dbfd76d255a19a02b22b2, name=test}}

出现了一个我不熟悉的类,叫做FindIterable。
它是驱动程序API的一部分,用于数据搜索。
将其与MongoCursor结合使用,作为一个迭代器来使用。

顺便提一下,有关迭代器的详细信息请查看这里→ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1345203893

游标.cursor.next();返回的是Object类型,可以直接转为String类型。

使用指定的参数来获取文档。

String doc = "";
String key = "name";
String param = "test";
Document query = new Document(key, param);

FindIterable<Document> iterator = coll.find(query);
MongoCursor cursor = iterator.iterator();

while(cursor.hasNext()){
     doc += cursor.next();
     doc += System.getProperty("line.separator");
}

System.out.println(doc);

只需在迭代器中作为参数传递搜索条件这样简单。
通过将其插入到实现bson接口的Document类中,将其转换为MongoDB可以读取的格式… 这是推测。
顺便提一下,如果要设置多个搜索条件,可以使用关联数组存储。如下所示。

Map<String, Object> map = new HashMap<String, Object>(){
    {put("name", "ほげ山ほげ太郎");}
    {put("age", 13);}
};
Document query = new Document(map);

创建插入数据时,可以使用先前编写的Document类。
如果在Document中插入时间戳,可以直接使用Date类型,它会自动处理。非常方便!

Document doc = new Document();

doc.append("name", "ほげ山ほげ太郎");
doc.append("age", 13);
Date currentDate = new Date();
doc.append("lastModified", "ISODate("+currentDate+")");

coll.insertOne(doc);

当将ObjectID直接存入MongoDB时,它会像以前一样自动生成。
以前,似乎可以通过解析JSON格式的字符串来创建ObjectID,但是随着驱动程序的升级,我无法确定它是变得不再可行还是被弃用了。
很遗憾,我没有找到任何执行示例。

如果要同时插入多个数据,可以使用insertMany()方法。
可以使用Document类型的List作为参数。
要同时插入多个数据,可以使用insertMany()方法。接受一个Document类型的List作为参数。

更新
 

正如上文所述,MongoDB在数据更新时具有独特的行为,会完全覆盖指定的内容。虽然有选项字符作为避免策略,但在本驱动程序中,您仍然可以使用相同的方式来更新文档。

Document updDoc = new Document("name", "ピコ山ピコ太郎");

coll.updateOne(Filters.eq("name", "ほげ山ほげ太郎"), new Document("$set", updDoc));

尽管在结构上有些复杂,但通过Filters类的eq方法可以搜索匹配的文档,并使用带有选项字符的更新文档对匹配的数据进行更新。
与插入操作类似,更新操作也有一个叫做updateMany()的方法,它将更新所有匹配的文档。

更新/插入数据如果想要实现「如果存在匹配的数据则更新,否则新建」的行为,同样可以使用updateOne()方法实现。唯一不同的是需要设置UpdateOptions。

Document updDoc = new Document("name", "ピコ山ピコ太郎");

UpdateOptions option = new UpdateOptions().upsert(true);

coll.updateOne(Filters.eq("name", "ほげ山ほげ太郎"), new Document("$set", updDoc), option);

删除## 删除文档
要删除文档,可以通过在Filters中指定条件来使用deleteOne()方法,这与直接在Mongo中操作相同。
对于敏锐的观察者来说,可能已经注意到还提供了deleteMany()方法。

//条件に一致するドキュメント1件削除
coll.deleteOne(Filters.eq("name", "test"));

//条件に一致するドキュメント全件削除
coll.deleteMany(Filters.eq("name", "test"));

删除收藏可以使用drop()方法来删除整个集合。
由于它被称为DROP DATABASE,所以SQL用户应该很熟悉。
个人而言,我觉得从MongoDatabase中可以像dropCollection(“collection_name”)这样删除集合更容易理解,但好像没有这样的方法1。

coll.drop();

删除连接データの操作が終わったら、クライアントのコネクションをクローズします。

cliant.close();

另外,通过使用try-with-Resources,您也可以省略MongoClient的关闭处理。

try (MongoClient cliant = new MongoCliant(addressArr)) {
    
  //DBを色々操作
  //本当は最後にcliant.close()としなければいけないところをスキップできる
}

请点击此处查看有关try-with-Resources语法的详细信息↓
https://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html

前言尾声我把基本的处理过程都写出来了。MongoDB是一种NoSQL数据库,如果你已经熟悉了结构严谨的MySQL或者postgres等数据库,那么可能需要一点时间适应MongoDB的一些独特之处。不过,如果按照顺序去理解驱动程序本身,并且对于CRUD(创建、读取、更新、删除)部分,因为与Mongo的客户端编写方式非常相似,所以如果你熟悉Java的话,应该会比较容易上手。
此外,还有很多其他的API可供使用,所以如果想知道自己想要做的事情能否实现,建议查阅官方文档等资料。结束。

有一个名为MongoDatabase.drop()的方法可以删除数据库本身,请注意避免误用。

bannerAds