Java如何将文档插入MongoDB集合?
在上一个MongoDB示例中,“如何在MongoDBJava驱动程序中表示文档?”中,我们已经看到了在MongoDBJava驱动程序中如何表示MongoDBJSON文档。
利用这些知识,现在是我们学习如何将文档插入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)); }
这就是我们引导/启动MongoDBJava驱动程序的方式。它在localhost端口连接到MongoDB服务器27017。如果您省略使用此类,ServerAddress则它也将默认连接到localhost端口27017。我们还需要向throwsUnknownHostException主方法签名中添加,因为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" } }