大小姊 發表於 2020-3-28 21:57:00

java操作MongoDB

<p>mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。 我们通过一个入门的案例来了解mongodb-driver的基本使用</p>
<h4>创建工程 mongoDemo, 引入依赖</h4>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">&lt;dependencies&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.mongodb&lt;/groupId&gt;
&lt;artifactId&gt;mongodb‐driver&lt;/artifactId&gt;
&lt;version&gt;3.6.3&lt;/version&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt;</pre>
</div>
<p><strong>创建测试类</strong></p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">import com.mongodb.*;
import com.mongodb.client.*;
import com.mongodb.client.model.Filters;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;

public class MogoDBTest {


    private static MongoClient mongoClient;

    static {
      System.out.println("===============MongoDBUtil初始化========================");
      mongoClient = new MongoClient("127.0.0.1", 27017);
      // 大部分用户使用mongodb都在安全内网下,但如果将mongodb设为安全验证模式,就需要在客户端提供用户名和密码:
      // boolean auth = db.authenticate(myUserName, myPassword);
      MongoClientOptions.Builder options = new MongoClientOptions.Builder();
      options.cursorFinalizerEnabled(true);
      // options.autoConnectRetry(true);// 自动重连true
      // options.maxAutoConnectRetryTime(10); // the maximum auto connect retry time
      options.connectionsPerHost(300);// 连接池设置为300个连接,默认为100
      options.connectTimeout(30000);// 连接超时,推荐&gt;3000毫秒
      options.maxWaitTime(5000); //
      options.socketTimeout(0);// 套接字超时时间,0无限制
      options.threadsAllowedToBlockForConnectionMultiplier(5000);// 线程队列数,如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
      options.writeConcern(WriteConcern.SAFE);//
      options.build();
    }

    // =================公用用方法=================
    /**
   * 获取DB实例 - 指定数据库,若不存在则创建
   * @param dbName
   * @return
   */
    public static MongoDatabase getDB(String dbName) {
      if (dbName != null &amp;&amp; !"".equals(dbName)) {
            MongoDatabase database = mongoClient.getDatabase(dbName);
            return database;
      }
      return null;
    }

    /**
   * 获取指定数据库下的collection对象
   * @param collName
   * @return
   */
    public staticMongoCollection&lt;Document&gt; getCollection(String dbName, String collName) {
      if (null == collName || "".equals(collName)) {
            return null;
      }
      if (null == dbName || "".equals(dbName)) {
            return null;
      }
      MongoCollection&lt;Document&gt; collection = mongoClient.getDatabase(dbName).getCollection(collName);
      return collection;
    }<br><br>    .....................
}
</pre>
</div>
<h1>1.数据库操作</h1>
<h2>1.1获取所有数据库</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">//获取所有数据库
    @Test
    public void getAllDBNames(){
      MongoIterable&lt;String&gt; dbNames = mongoClient.listDatabaseNames();
      for (String s : dbNames) {
            System.out.println(s);
      }
    }
</pre>
</div>
<h2><strong>1.2.获取指定库的所有集合名</strong></h2>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">    //获取指定库的所有集合名
    @Test
    public void getAllCollections(){
      MongoIterable&lt;String&gt; colls = getDB("books").listCollectionNames();
      for (String s : colls) {
            System.out.println(s);
      }
    }
</pre>
</div>
<h2>1.3.删除数据库</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">//删除数据库
    @Test
    public void dropDB(){
      //连接到数据库
      MongoDatabase mongoDatabase =getDB("test");
      mongoDatabase.drop();
    }
</pre>
</div>
<h1>2.文档操作  </h1>
<h2>2.1插入文档</h2>
<p><strong>1.插入单个文档</strong></p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">    //插入一个文档
    @Test
    public void insertOneTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //要插入的数据
      Document document = new Document("id",1)
                .append("name", "哈姆雷特")
                .append("price", 67);
      //插入一个文档
      collection.insertOne(document);
      System.out.println(document.get("_id"));
    }
</pre>
</div>
<p><strong> 2.插入多个文档</strong></p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">//插入多个文档
    @Test
    public void insertManyTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //要插入的数据
      List&lt;Document&gt; list = new ArrayList&lt;&gt;();
      for(int i = 1; i &lt;= 15; i++) {
            Document document = new Document("id",i)
                  .append("name", "book"+i)
                  .append("price", 20+i);
            list.add(document);
      }
      //插入多个文档
      collection.insertMany(list);
    }
</pre>
</div>
<h2>2.2查询文档</h2>
<h3>2.2.1基本查询</h3>
<p> 1.查询集合所有文档</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">    @Test
    public void findAllTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //查询集合的所有文档
      FindIterable findIterable= collection.find();
      MongoCursor cursor = findIterable.iterator();
      while (cursor.hasNext()) {
            System.out.println(cursor.next());
      }
    }
</pre>
</div>
<p>2.条件查询</p>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">@Test
    public void findConditionTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //方法1.构建BasicDBObject查询条件 id大于2,小于5
      BasicDBObject queryCondition=new BasicDBObject();
      queryCondition.put("id", new BasicDBObject("$gt", 2));
      queryCondition.put("id", new BasicDBObject("$lt", 5));
      //查询集合的所有文通过price升序排序
      FindIterable findIterable= collection.find(queryCondition).sort(new BasicDBObject("price",1));

      //方法2.通过过滤器Filters,Filters提供了一系列查询条件的静态方法   id大于2小于5   通过id升序排序查询
      //Bson filter=Filters.and(Filters.gt("id", 2),Filters.lt("id", 5));
      //FindIterable findIterable= collection.find(filter).sort(Sorts.orderBy(Sorts.ascending("id")));

      //查询集合的所有文
      MongoCursor cursor = findIterable.iterator();
      while (cursor.hasNext()) {
            System.out.println(cursor.next());
      }
    }
</pre>
</div>
<p>  </p>
<p>  </p>
<h3>2.2.2 投影查询</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">    @Test
    public void findAllTest3(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //查询id等于1,2,3,4的文档
      Bson fileter=Filters.in("id",1,2,3,4);
      //查询集合的所有文档
      FindIterable findIterable= collection.find(fileter).projection(new BasicDBObject("id",1).append("name",1).append("_id",0));
      MongoCursor cursor = findIterable.iterator();
      while (cursor.hasNext()) {
            System.out.println(cursor.next());
      }
    }</pre>
</div>
<h2>2.3分页查询 </h2>
<h3>2.3.1.统计查询</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">//集合的文档数统计
    @Test
    public void getCountTest() {
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //获取集合的文档数
      Bson filter = Filters.gt("price", 30);
      int count = (int)collection.count(filter);
      System.out.println("价钱大于30的count==:"+count);
    }
</pre>
</div>
<p>  </p>
<h3>2.3.2分页列表查询 </h3>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">    //分页查询
    @Test
    public void findByPageTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //分页查询跳过0条,返回前10条
      FindIterable findIterable= collection.find().skip(0).limit(10);
      MongoCursor cursor = findIterable.iterator();
      while (cursor.hasNext()) {
            System.out.println(cursor.next());
      }
      System.out.println("----------取出查询到的第一个文档-----------------");
      //取出查询到的第一个文档
      Document document = (Document) findIterable.first();
      //打印输出
      System.out.println(document);
    }</pre>
</div>
<h2>2.4修改文档</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">//修改文档
    @Test
    public void updateTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //修改id=2的文档    通过过滤器Filters,Filters提供了一系列查询条件的静态方法
      Bson filter = Filters.eq("id", 2);
      //指定修改的更新文档
      Document document = new Document("$set", new Document("price", 44));
      //修改单个文档
      collection.updateOne(filter, document);
      //修改多个文档
      // collection.updateMany(filter, document);
      //修改全部文档
      //collection.updateMany(new BasicDBObject(),document);
    }</pre>
</div>
<h2>2.5 删除文档</h2>
<div class="cnblogs_Highlighter">
<pre class="brush:java;gutter:true;">//删除与筛选器匹配的单个文档
    @Test
    public void deleteOneTest(){
      //获取集合
      MongoCollection&lt;Document&gt; collection = getCollection("books","book");
      //申明删除条件
      Bson filter = Filters.eq("id",3);
      //删除与筛选器匹配的单个文档
      collection.deleteOne(filter);

      //删除与筛选器匹配的所有文档
       // collection.deleteMany(filter);

      System.out.println("--------删除所有文档----------");
      //删除所有文档
       // collection.deleteMany(new Document());
    }</pre>
</div>
<p>  </p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/mabaoying/p/12589583.html
頁: [1]
查看完整版本: java操作MongoDB