Spring Boot MongoDB 查詢操作 (BasicQuery ,BSON)


MongoDB 查詢有四種方式:Query,TextQuery,BasicQuery 和 Bson ,網上太多關於 Query 的查詢方式,本文只記錄 BasicQuery和Bson 的方式,BasicQuery 相對於 Query 更加的靈活,BasicQuery 就是 Query 的擴展,BasicQuery 可以返回指定列數據。最靈活的是Bson方式。

大寫的采坑經驗

1.MongoDB 雖然存儲很靈活,但是,不要存儲Map類型的,不要存儲Map類型的,不要存儲Map類型的。盡量存儲強類型的,盡量存儲強類型的,盡量存儲強類型的。如果有Map類型的,對於查詢指定列的,只能用Bson ,如果是強類型的,就可以直接用Query,TextQuery。

2.復雜類型查詢 可以考慮 Bson 方式,Bson 請參考文章最后。

 

 安裝Maven包

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

 

測試數據代碼

 for (Long i = 0L; i < 10L; i++) {
     MongoDBTestVo vo=new MongoDBTestVo();
     vo.setUserId(i);
     vo.setEmail("1@1.com");
     vo.setName("test"+i.toString());
     vo.setPhone(i.toString());
     vo.setCreateDate(new Date());
     mongoTemplate.insert(vo,"mongodbtest");
}
public class MongoDBTestVo implements Serializable {
    private Long userId;
    private String email;
    private String name;
    private String phone;
    private Date createDate;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }
}
MongoDBTestVo Code

 

單條件查詢

DBObject obj = new BasicDBObject();
obj.put("userId", new BasicDBObject("$gte", 2)); // userId>=2的條件
//
obj.put("userId", 2); userId=2 的條件
Query query = new BasicQuery(obj.toString()); 
List
<MongoDBTestVo> result = mongoTemplate.find(query, MongoDBTestVo.class, "mongodbtest");

 

多條件查詢

BasicDBList basicDBList = new BasicDBList();
basicDBList.add(new BasicDBObject("userId", 2L));
basicDBList.add(new BasicDBObject("name","test2"));

DBObject obj = new BasicDBObject();
obj.put("$and", basicDBList);

Query query = new BasicQuery(obj.toString());

List<MongoDBTestVo> result = mongoTemplate.find(query, MongoDBTestVo.class, "mongodbtest");

 

查看指定列的數據

DBObject obj = new BasicDBObject();
obj.put("userId", new BasicDBObject("$gte", 2));

BasicDBObject fieldsObject = new BasicDBObject();
fieldsObject.put("userId", 1);
fieldsObject.put("name", 1);

Query query = new BasicQuery(obj.toString(), fieldsObject.toString());

List<Map> result = mongoTemplate.find(query, Map.class, "mongodbtest");

BasicQuery查詢語句可以指定返回字段,構造函數BasicQuery(DBObject queryObject, DBObject fieldsObject),fieldsObject 這個字段可以指定返回字段

fieldsObject.put(key,value)

            key:字段

           value:

             說明:

                  1或者true表示返回字段

                 0或者false表示不返回該字段

               _id:默認就是1,沒指定返回該字段時,默認會返回,除非設置為0是,就不會返回該字段。

指定返回字段,有時文檔字段多並數據大時,我們指定返回我們需要的字段,這樣既節省傳輸數據量,減少了內存消耗,提高了性能,在數據大時,性能很明顯的。

 

Bson查詢方式

Bson bson = Filters.and(Arrays.asList(
                    Filters.gte("createdTime", Calendar.getInstance().getTime()),
                    Filters.gte("apis.count", 1)));
MongoCursor<Document> cursor = null;
try {
    FindIterable<Document> findIterable = mongoTemplate.getCollection("mongodbtest").find(bson);
    cursor = findIterable.iterator();
    List<MongoDBTestVo> list = new ArrayList<>();
    while (cursor.hasNext()) {
          Document object = cursor.next();
          MongoDBTestVo entity = JSON.parseObject(object.toJson(), MongoDBTestVo.class);
          list.add(entity);
     }
     return list;
} finally {
   if (cursor != null) {
       cursor.close();
   }
}

 Bson返回指定列

Bson bson = Filters.and(Arrays.asList(
                    Filters.gte("createdTime", Calendar.getInstance().getTime()),
                    Filters.gte("apis.count", 1)));
BasicDBObject fieldsObject = new BasicDBObject();
fieldsObject.put("apis.count", 1);
fieldsObject.put("_id", 0);
MongoCursor<Document> cursor = null;
try {
    FindIterable<Document> findIterable = mongoTemplate.getCollection("mongodbtest").find(bson).projection(Document.parse(fieldsObject.toString()));
    cursor = findIterable.iterator();
    List<MongoDBTestVo> list = new ArrayList<>();
    while (cursor.hasNext()) {
          Document object = cursor.next();
          MongoDBTestVo entity = JSON.parseObject(object.toJson(), MongoDBTestVo.class);
          list.add(entity);
     }
     return list;
} finally {
   if (cursor != null) {
       cursor.close();
   }
}

 Bson 排序

Bson bson = Filters.and(Arrays.asList(
Filters.gte("createdTime", Calendar.getInstance().getTime()), Filters.gte("apis.count", 1)));
BasicDBObject fieldsObject = new BasicDBObject();
fieldsObject.put("apis.count", 1);
fieldsObject.put("_id", 0);
BasicDBObject sort = new BasicDBObject();
sort.put("createdTime", 1);
MongoCursor<Document> cursor = null; try { FindIterable<Document> findIterable = mongoTemplate.getCollection("mongodbtest").find(bson).projection(Document.parse(fieldsObject.toString())).sort(sort); cursor = findIterable.iterator(); List<MongoDBTestVo> list = new ArrayList<>(); while (cursor.hasNext()) { Document object = cursor.next(); MongoDBTestVo entity = JSON.parseObject(object.toJson(), MongoDBTestVo.class); list.add(entity); } return list; } finally { if (cursor != null) { cursor.close(); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM