本文以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 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 findAll() {
List results = new ArrayList();
FindIterable iterables = collection.find();
MongoCursor 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 findBy(Bson filter) {
List results = new ArrayList();
FindIterable iterables = collection.find(filter);
MongoCursor 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 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 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 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 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 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 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 results3 = MongoDb.findBy(queryObjectOr);
List 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 results3 = MongoDb.findBy(queryObjectIn);
List 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 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 results1 = MongoDb.findBy(filter);
for(Document doc : results1){
System.out.println(doc.toJson());
}
System.out.println("============= ");
List 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 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 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 results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
MongoDb.deleteOne(filter);
List 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 results = MongoDb.findBy(filter);
for(Document doc : results){
System.out.println(doc.toJson());
}
MongoDb.deleteMany(filter);
List 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