使用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>
<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 环境进行配置。
可以通过指定 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);
//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}}
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}}
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);
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);
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();
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();
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