本文以mongo-java-driver-3.5.0.jar爲例
1 需要的jar包:https://pan.baidu.com/s/1jI3kB9W 密碼:79hv
mongo-java-driver-3.5.0.jar
junit-4.9.jar
2 spring-data-mongodb-1.8.0.RELEASE版本查詢mongodb數據庫時候,構造查詢條件時候會把大寫字母開頭字段名自動改成小寫字母開頭。
解決:由於spring+springmvc+hibernate5環境中會存在jar衝突,就沒有嘗試其他版本spring-data-mongodb,直接採用mongo-java-driver操作mongodb。
mongo-java-driver-3.5.0接口地址:http://mongodb.github.io/mongo-java-driver/3.5/javadoc/
// 1.8.0.RELEASE版本中,執行下面語句時候,mongodb的字段名'Name'自動變爲'name'
// 會報錯:mongodb中找不到'name'字段
mongoTemplate.findOne(new Query(Criteria.where("Name").is("testMongodb")), User.class, "collectionName");
3 mongo-java-driver操作mongodb代碼(增刪改查,細節已在註釋中給出,比如多條件查詢有兩種條件組合方法:Document.append和Filters)
3.1 MongoDb.java
package mongo.mongodb;
import java.util.ArrayList;
import java.util.List;
import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.UpdateResult;
public class MongoDb {
private static MongoCollection<Document> collection;
/**
* 鏈接數據庫
*
* @param databaseName
* 數據庫名稱
* @param collectionName
* 集合名稱
* @param hostName
* 主機名
* @param port
* 端口號
*/
public static void connect(String databaseName, String collectionName,
String hostName, int port) {
@SuppressWarnings("resource")
MongoClient client = new MongoClient(hostName, port);
MongoDatabase db = client.getDatabase(databaseName);
collection = db.getCollection(collectionName);
System.out.println(collection);
}
/**
* 插入一個文檔
*
* @param document
* 文檔
*/
public static void insert(Document document) {
collection.insertOne(document);
}
/**
* 查詢所有文檔
*
* @return 所有文檔集合
*/
public static List<Document> findAll() {
List<Document> results = new ArrayList<Document>();
FindIterable<Document> iterables = collection.find();
MongoCursor<Document> cursor = iterables.iterator();
while (cursor.hasNext()) {
results.add(cursor.next());
}
return results;
}
/**
* 根據條件查詢
*
* @param filter
* 查詢條件 //注意Bson的幾個實現類,BasicDBObject, BsonDocument,
* BsonDocumentWrapper, CommandResult, Document, RawBsonDocument
* @return 返回集合列表
*/
public static List<Document> findBy(Bson filter) {
List<Document> results = new ArrayList<Document>();
FindIterable<Document> iterables = collection.find(filter);
MongoCursor<Document> cursor = iterables.iterator();
while (cursor.hasNext()) {
results.add(cursor.next());
}
return results;
}
/**
* 更新查詢到的第一個
*
* @param filter
* 查詢條件
* @param update
* 更新文檔
* @return 更新結果
*/
public static UpdateResult updateOne(Bson filter, Bson update) {
UpdateResult result = collection.updateOne(filter, update);
return result;
}
/**
* 更新查詢到的所有的文檔
*
* @param filter
* 查詢條件
* @param update
* 更新文檔
* @return 更新結果
*/
public static UpdateResult updateMany(Bson filter, Bson update) {
UpdateResult result = collection.updateMany(filter, update);
return result;
}
/**
* 更新一個文檔, 結果是replacement是新文檔,老文檔完全被替換
*
* @param filter
* 查詢條件
* @param replacement
* 跟新文檔
*/
public static UpdateResult replaceOne(Bson filter, Document replacement) {
UpdateResult result = collection.replaceOne(filter, replacement);
return result;
}
/**
* 根據條件刪除一個文檔
*
* @param filter
* 查詢條件
*/
public static void deleteOne(Bson filter) {
collection.deleteOne(filter);
}
/**
* 根據條件刪除多個文檔
*
* @param filter
* 查詢條件
*/
public static void deleteMany(Bson filter) {
collection.deleteMany(filter);
}
}
3.2 MongoTest
package mongo.mongodb;
import java.util.List;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.junit.Before;
import org.junit.Test;
import com.mongodb.BasicDBObject;
import com.mongodb.client.model.Filters;
import com.mongodb.client.result.UpdateResult;
public class MongoTest
{
@Before
public void before(){
MongoDb.connect("test", "user", "127.0.0.1", 27017);
}
/**
* 插入測試
*/
@Test
public void testInsert(){
Document document = new Document();
document.append("name", "nie").append("password", "nie").append("nickname", "nn").append("iid", 8);
MongoDb.insert(document);
}
/**
* 查詢全部記錄
*/
@Test
public void testFindAll(){
List<Document> results = MongoDb.findAll();
for(Document doc : results){
System.out.println(doc.toJson());
}
}
/**
* 精確查詢
*/
@Test
public void testFindByExactQuery(){
Document filter = new Document();
filter.append("name", "yy");
filter.append("nickname", "ygirl");
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
}
/**
* 模糊,精確混合查詢
* 利用Document.append隨意添加條件
*/
@Test
public void testFindByLickQuery1(){
int iid = 2;
String name = "";
String nickname = "";
Document filter = new Document();
if (iid >= 0) {
filter.append("iid", new Document("$gte", 2));
}
if (name != "") {
filter.append("name",new Document("$regex", "y"));
}
if (nickname != "") {
filter.append("nickname","ygirl2");
}
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
}
/**
* 模糊,精確混合查詢
* 利用Filters隨意添加條件,條件越多越麻煩
*/
@Test
public void testFindByLickQuery2(){
int iid = 2;
String name = "y";
String nickname = "ygirl2";
Bson filter = null;
if (iid >= 0) {
if (name != "") {
if (nickname != "") {
filter = Filters.and(Filters.gte("iid", iid), Filters.eq("nickname", nickname), Filters.regex("name", name));
} else {
filter = Filters.and(Filters.gte("iid", iid), Filters.regex("name", name));
}
} else {
if (nickname != "") {
filter = Filters.and(Filters.gte("iid", iid), Filters.eq("nickname", nickname));
} else {
filter = Filters.and(Filters.gte("iid", iid));
}
}
} else {
if (name != "") {
if (nickname != "") {
filter = Filters.and(Filters.eq("nickname", nickname), Filters.regex("name", name));
} else {
filter = Filters.and(Filters.regex("name", name));
}
} else {
if (nickname != "") {
filter = Filters.and(Filters.eq("nickname", nickname));
} else {
filter = Filters.and();
}
}
}
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
}
/**
* Document OR AND 查詢
*/
@Test
public void testFindByOrAnd(){
// (查詢iid等於2或者iid等於8的數據) 失敗 只能查到8
Document filter = new Document();
filter.append("iid", 2);
filter.append("iid", 8);
List<Document> results = MongoDb.findBy(filter);
// $or (查詢iid等於2或者iid等於8的數據)
BasicDBObject queryObjectOr = new BasicDBObject().append(
"$or",
new BasicDBObject[] { new BasicDBObject("iid", 2),
new BasicDBObject("iid", 8) });
// (查詢iid等於2並且name等於nie的數據) 成功查出相應數據
Document filter2 = new Document();
filter2.append("iid", 2);
filter2.append("name", "yy");
List<Document> results2 = MongoDb.findBy(filter2);
// $and(查詢iid等於2並且name等於nie的數據)
BasicDBObject queryObjectAnd = new BasicDBObject().append("$and",
new BasicDBObject[] { new BasicDBObject("iid", 2),
new BasicDBObject("name", "yy") });
List<Document> results3 = MongoDb.findBy(queryObjectOr);
List<Document> results4 = MongoDb.findBy(queryObjectAnd);
for(Document doc : results){
System.out.println(doc.toJson());
}
System.out.println("==========");
for(Document doc : results3){
System.out.println(doc.toJson());
}
System.out.println("==========");
for(Document doc : results4){
System.out.println(doc.toJson());
}
System.out.println("==========");
for(Document doc : results2){
System.out.println(doc.toJson());
}
}
/**
* Document in nin 查詢
*/
@Test
public void testFindByInNin(){
// $in (查詢iid爲1和2的數據)
BasicDBObject queryObjectIn = new BasicDBObject().append("iid", new BasicDBObject(
"$in", new int[] { 2, 8 }));
// $nin (查詢iid不爲1,2,3,4,5,6,7,8,9的數據)
BasicDBObject queryObjectNin = new BasicDBObject().append("iid", new BasicDBObject(
"$nin", new int[] { 2, 9 }));
List<Document> results3 = MongoDb.findBy(queryObjectIn);
List<Document> results4 = MongoDb.findBy(queryObjectNin);
for(Document doc : results3){
System.out.println(doc.toJson());
}
System.out.println("==========");
for(Document doc : results4){
System.out.println(doc.toJson());
}
}
/**
* 更新符合條件的第一條記錄的字段
* 用"$set"更新
*/
@Test
public void testUpdateOne(){
Document filter = new Document();
filter.append("nickname", "ygirl");
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
Document filter2 = new Document();
filter2.append("nickname", "ygirl1");
//注意update文檔裏要包含"$set"字段
Document update = new Document();
update.append("$set", new Document("nickname", "ygirl1").append("password", "ygirl1"));
UpdateResult result = MongoDb.updateOne(filter, update);
System.out.println("matched count = " + result.getMatchedCount());
List<Document> results1 = MongoDb.findBy(filter);
for(Document doc : results1){
System.out.println(doc.toJson());
}
System.out.println("============= ");
List<Document> results2 = MongoDb.findBy(filter2);
for(Document doc : results2){
System.out.println(doc.toJson());
}
}
/**
* 更新符合條件的所有記錄的字段
* 用"$set"更新
*/
@Test
public void testUpdateMany(){
Document filter = new Document();
filter.append("nickname", "ygirl");
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
//注意update文檔裏要包含"$set"字段
Document update = new Document();
update.append("$set", new Document("nickname", "ygirl1").append("password", "ygirl1"));
UpdateResult result = MongoDb.updateMany(filter, update);
System.out.println("matched count = " + result.getMatchedCount());
}
/**
* 更新符合條件的第一條記錄的字段
* 不用"$set"更新
*/
@Test
public void testReplace(){
Document filter = new Document();
filter.append("nickname", "ygirl1");
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
//注意:更新文檔時,不需要使用"$set"
Document update = new Document();
update.append("nickname", "ygirl").append("password", "123");
UpdateResult result = MongoDb.replaceOne(filter, update);
System.out.println("matched count = " + result.getMatchedCount());
}
/**
* 刪除符合條件的第一條記錄
*/
@Test
public void testDeleteOne(){
Document filter = new Document();
filter.append("nickname", "ygirl1");
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
MongoDb.deleteOne(filter);
List<Document> results2 = MongoDb.findBy(filter);
System.out.println("========");
for(Document doc : results2){
System.out.println(doc.toJson());
}
}
/**
* 刪除符合條件的所有記錄
*/
@Test
public void testDeleteMany(){
Document filter = new Document();
filter.append("nickname", "ygirl1");
List<Document> results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
MongoDb.deleteMany(filter);
List<Document> results2 = MongoDb.findBy(filter);
System.out.println("========");
for(Document doc : results2){
System.out.println(doc.toJson());
}
}
}
3.3 QueryOperators.java(非運行必須,操作數據庫用到關鍵字)
package mongo.mongodb;
/**
* MongoDB keywords for various query operations
*
* @author yanzi
*/
public class QueryOperators {
// $or或者,相當於sql or
//BasicDBObject queryObjectOr = new BasicDBObject().append(QueryOperators.OR,
//new BasicDBObject[] { new BasicDBObject("iid", 2), new BasicDBObject("iid", 8) });
public static final String OR = "$or";
// $and並且,相當於sql and
public static final String AND = "$and";
// $gt 大於
public static final String GT = "$gt";
// $gte 大於等於
public static final String GTE = "$gte";
// $lt 小於
public static final String LT = "$lt";
// $lte 小於等於
public static final String LTE = "$lte";
public static final String NE = "$ne";
public static final String IN = "$in";
public static final String NIN = "$nin";
public static final String MOD = "$mod";
public static final String ALL = "$all";
public static final String SIZE = "$size";
public static final String EXISTS = "$exists";
public static final String ELEM_MATCH = "$elemMatch";
// $regex 模糊匹配,相當於sql中like
public static final String REGEX = "$regex";
// (to be implemented in QueryBuilder)
public static final String WHERE = "$where";
public static final String NOR = "$nor";
public static final String TYPE = "$type";
public static final String NOT = "$not";
// geo operators
public static final String WITHIN = "$within";
public static final String NEAR = "$near";
public static final String NEAR_SPHERE = "$nearSphere";
public static final String BOX = "$box";
public static final String CENTER = "$center";
public static final String POLYGON = "$polygon";
public static final String CENTER_SPHERE = "$centerSphere";
// (to be implemented in QueryBuilder)
public static final String MAX_DISTANCE = "$maxDistance";
public static final String UNIQUE_DOCS = "$uniqueDocs";
// meta query operators (to be implemented in QueryBuilder)
public static final String RETURN_KEY = "$returnKey";
public static final String MAX_SCAN = "$maxScan";
public static final String ORDER_BY = "$orderby";
public static final String EXPLAIN = "$explain";
public static final String SNAPSHOT = "$snapshot";
public static final String MIN = "$min";
public static final String MAX = "$max";
public static final String SHOW_DISK_LOC = "$showDiskLoc";
public static final String HINT = "$hint";
public static final String COMMENT = "$comment";
// 其他關鍵字
// $set 更新記錄,
// Document update = new Document();
// update.append("$set", new Document("nickname", "ygirl1").append("password", "ygirl1"));
public static final String SET = "$set";
}
4 參考文章
http://blog.csdn.net/maosijunzi/article/details/42100535