在上一个MongoDB示例中,“如何在MongoDB Java驱动程序中表示文档?”中,我们已经看到了在MongoDB Java驱动程序中如何表示MongoDB JSON文档。
利用这些知识,现在是我们学习如何将文档插入MongoDB集合的时候了。我们将创建一个代码片段,将文档插入数据库的teachers集合中school。我们将首先看到完整的代码片段,然后是该代码片段的详细描述。因此,让我们从代码片段开始。
package org.nhooo.example.mongodb;
import com.mongodb.*;
import java.net.UnknownHostException;
import java.util.Arrays;
public class MongoDBInsertDocument {
public static void main(String[] args) throws UnknownHostException {
// 创建MongoDB客户端实例。
MongoClient client = new MongoClient(
new ServerAddress("localhost", 27017));
// 从MongoDB实例获取学校数据库。
DB database = client.getDB("schools");
// 从数据库中获取教师集合。
DBCollection collection = database.getCollection("teachers");
collection.drop();
// 创建一个要存储在教师集合中的文档。
DBObject document = new BasicDBObject("firstName", "John")
.append("lastName", "Doe")
.append("subject", "Computer Science")
.append("languages", Arrays.asList("Java", "C", "C++"))
.append("email", "john.doe@school.com")
.append("address",
new BasicDBObject("street", "Main Apple St. 12")
.append("city", "New York")
.append("country", "USA"));
// 打印文档的值。
System.out.println("document = " + document);
// 将文档插入数据库中的集合。
collection.insert(document);
// 插入集合后,打印文档的值。
System.out.println("document = " + document);
}
}该代码段应该易于理解。但是,我将在这里进一步解释。在代码段的开头,我们从以下几行开始:
public static void main(String[] args) throws UnknownHostException {
// 创建MongoDB客户端实例。
MongoClient client = new MongoClient(
new ServerAddress("localhost", 27017));
}这就是我们引导/启动MongoDB Java驱动程序的方式。它在localhost端口连接到MongoDB服务器27017。如果您省略使用此类,ServerAddress则它也将默认连接到localhost端口27017。我们还需要向throws UnknownHostException主方法签名中添加,因为MongoClient在服务器不可用时创建可能会引发此异常。或者,您也可以将代码包装在一个try-catch块中。在接下来的几行中,您可以看到以下代码。
// 从MongoDB实例获取学校数据库。
DB database = client.getDB("schools");
// 从数据库中获取教师集合。
DBCollection collection = database.getCollection("teachers");
collection.drop();此代码段告诉您如何获取数据库,即school数据库。我们使用client.getDB()方法调用并将数据库名称作为参数来获取数据库。然后,对该数据库的引用存储在名为的变量中database。有了之后,database我们可以teachers通过调用database.getCollection()方法来访问集合。
您还注意到我们调用collection.drop(),这将清除集合。我们仅将其用于示例目的,只是为了确保每次执行代码段时,在插入某些文档之前都会清理集合。
接下来,我们创建要存储在teachers集合中的文档。我们定义一个document带有DBObjecttype的变量,该变量引用type的实例BasicDBObject。并且我们在文档中添加了一些字段,并在数组类型字段中添加了另一个嵌入式文档。
// 创建一个要存储在教师集合中的文档。
DBObject document = new BasicDBObject("firstName", "John")
.append("lastName", "Doe")
.append("subject", "Computer Science")
.append("languages", Arrays.asList("Java", "C", "C++"))
.append("email", "john.doe@school.com")
.append("address",
new BasicDBObject("street", "Main Apple St. 12")
.append("city", "New York")
.append("country", "USA"));在最后三行中,我们执行以下操作:
// 打印文档的值。
System.out.println("document = " + document);
// 将文档插入数据库中的集合。
collection.insert(document);
// 插入集合后,打印文档的值。
System.out.println("document = " + document);在第一个打印输出中,我们将document使用BasicDBObject所有定义的字段值使用上一行中定义的。然后,它调用collection.insert()方法将文档插入到集合中。
在最后一行,我们document再次打印出。您可能会看到结果与第一次打印的结果几乎相同,但是您会注意到,在将其插入到集合中之后,document现在有了另一个字段,该_id字段是Java驱动程序分配为文档的对象ID的字段。的_id,如果我们没有定义自动添加_id文档中域。本质上与我们使用以下代码定义文档相同,其中代码_id类型为org.bson.types.ObjectId。
DBObject document = new BasicDBObject("_id", new ObjectId());这些是上面代码的实际输出:
document = {
"firstName" : "John" ,
"lastName" : "Doe" ,
"subject" : "Computer Science" ,
"languages" : [ "Java" , "C" , "C++"] ,
"email" : "john.doe@school.com" ,
"address" : {
"street" : "Main Apple St. 12" ,
"city" : "New York" ,
"country" : "USA"
}
}
document = {
"firstName" : "John" ,
"lastName" : "Doe" ,
"subject" : "Computer Science" ,
"languages" : [ "Java" , "C" , "C++"] ,
"email" : "john.doe@school.com" ,
"address" : {
"street" : "Main Apple St. 12" ,
"city" : "New York" ,
"country" : "USA"
},
"_id" : { "$oid" : "5408744803649d9155a296b7" }
}