`
dengwanchuan
  • 浏览: 47341 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

NoSQL之MongoDB的CRUD操作

阅读更多

MongoDB是一个基于分布式文件存储的数据库,是NoSQL实现的一种,支持Java.NoSQL越来越受到IT界的重视,所以掌握NoSQL技术,也非常重要。

在空闲时间写了Mongo的CRUD代码,请大家参考。有什么地方不好或意见,大家可以提出!

 

import java.lang.reflect.Field;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONObject;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.util.JSON;


/**
 * 
 * <b>功能:实现MongoDB的CRUD操作</b><br> 
 * <br>
 * <b>完整路径:</b> .MongoUtil2 <br> 
 * <b>创建日期:</b> 2012-4-26 上午10:54:56 <br>
 * @author <a href="mailto:dengwanchuan@shareinfo.com.cn">dwc</a><br>
 *         <a href="http://www.shareinfo.com.cn">Shenzhen Share Info System Co.,Ltd.</a>
 * @version 1.0, 2012-4-26
 */
public class MongoDBUtil{
	private static final String URL="localhost";//连接地址
	private static final int PORT=27017;//连接端口
	private static final String DB="test";//连接DB

	private static Mongo mg = null;
	private static DB db=null;
	private DBCollection conn=null;

	/**
	 * 
	 * <b>功能:单例模式</b><br>
	 * <b>提示:在这里DB理解为数据库,DBCollection理解为表</b><br>
	 * <br>
	 * @修改者 ~ 邓万川, 2012-4-26
	 * @return DB
	 */
	private static synchronized  DB getDb(){
		try {
			if(db==null){
				mg = new Mongo(URL, PORT);
				//获取 DB;如果默认没有创建,mongodb会自动创建
				db = mg.getDB(DB);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return db;
	}

	/**
	 * 
	 * <b>功能:获取连接</b><br>
	 * <br>
	 * @修改者 ~dwc, 2012-4-26
	 * @param connName 表连接名称
	 * @return DBCollection 表连接对象
	 */
	public static DBCollection  getConn(String connName){
		getDb();
		return db.getCollection(connName);
	}

	/**
	 * 
	 * <b>功能:对象销毁,清除内存</b><br>
	 * <br>
	 * @修改者 ~ dwc 2012-4-26 void
	 */
	public void destory() {
		if (mg != null)
			mg.close();
		mg = null;
		db = null;
		conn = null;
		System.gc();
	}

	/**
	 * 
	 * <b>功能:根据Mongo对象条件查询所有数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param dbObject Mongo条件对象
	 * @param connName 表连接名称
	 * @param className 获取对象的类名称
	 * @return
	 * @throws Exception List 返回集合
	 */
	public List findAll(DBObject dbObject,String connName,String className)throws Exception{
		List<Object> resultList=new ArrayList<Object>();
		try {
			conn=getConn(connName);
			List<DBObject> list = conn.find(dbObject).toArray();
			for(DBObject dbObj:list){
				Object obj= DB2Bean(dbObj,className);
				resultList.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return resultList;
	}
	
	/**
	 * 
	 * <b>功能:根据自定义对象条件查询所有数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param object 定义条件对象
	 * @param connName 表连接名称
	 * @param className 获取对象的类名称
	 * @return
	 * @throws Exception List 返回集合
	 */
	public List findAll(Object object,String connName,String className)throws Exception{
		List<Object> resultList=new ArrayList<Object>();
		try {
			conn=getConn(connName);
			List<DBObject> list = conn.find(bean2DB(object)).toArray();
			for(DBObject dbObj:list){
				Object obj= DB2Bean(dbObj,className);
				resultList.add(obj);
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return resultList;
	}


	/**
	 * 
	 * <b>功能:根据Mongo对象查询单个数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param dbObject   Mongo条件对象
	 * @param connName 表连接名称
	 * @param className 获取对象的类名称
	 * @return 
	 * @throws Exception Object 返回对象
	 */
	public Object findOne(DBObject dbObject,String connName,String className)throws Exception{
		Object obj=null;
		try {
			conn=getConn(connName);
			DBObject result = conn.findOne(dbObject);
			obj=DB2Bean(dbObject, className);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return obj;
	}
	
	
	/**
	 * 
	 * <b>功能:根据自定义对象查询单个数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param object   自定义条件对象
	 * @param connName 表连接名称
	 * @param className 获取对象的类名称
	 * @return
	 * @throws Exception Object 返回对象
	 */
	public Object findOne(Object object,String connName,String className)throws Exception{
		Object obj=null;
		try {
			conn=getConn(connName);
			DBObject result = conn.findOne(bean2DB(object));
			obj=DB2Bean(result, className);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			destory();
		}
		return obj;
	}
	
	/**
	 * 
	 * <b>功能:根据条件id查询数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param id 条件id
	 * @param connName  表连接名称
	 * @param className 获取对象的类名称
	 * @return
	 * @throws Exception Object 返回对象
	 */
	public Object findOneById(Object id,String connName,String className)throws Exception{
		Object obj=null;
		try {
			conn=getConn(connName);
			DBObject dbObject = conn.findOne(new BasicDBObject("_id",id));
			obj=DB2Bean(dbObject, className);
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return obj;
	}

	/**
	 * 
	 * <b>功能:增加数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param obj  要增加对象
	 * @param connName  表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int add(Object obj,String connName)throws Exception{
		int result=-1;
		try {
			conn=getConn(connName);
			DBObject dbObject= (DBObject) JSON.parse(JSONObject.fromObject(obj).toString());
			result=conn.insert(dbObject).getN();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return result;
	}
	
	/**
	 * 
	 * <b>功能:增加数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param dbObject 封装对象的数据
	 * @param connName  表连接名称
	 * @return
	 * @throws Exception int  返回影响结果
	 */
	public int add(DBObject dbObject,String connName)throws Exception{
		int result=-1;
		try {
			conn=getConn(connName);
			result=conn.insert(dbObject).getN();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return result;
	}

	/**
	 * 
	 * <b>功能:修改数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param value 修改的数据
	 * @param where 修改条件
	 * @param connName  表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int update(DBObject value,DBObject where,String connName) throws Exception{
		int result=-1;
		try {
			conn=getConn(connName);
			result= conn.update(where, value).getN();
		} catch (MongoException e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return result;
	}
	

	/**
	 * 
	 * <b>功能:修改数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param value 修改的数据
	 * @param where 修改条件
	 * @param connName  表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int update(Object value,Object where,String connName)throws Exception {
		int result=-1;
		try {
			conn=getConn(connName);
			result= conn.update(bean2DB(where),bean2DB(value)).getN();
		} catch (MongoException e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return result;
	}

	/**
	 * 
	 * <b>功能:根据条件删除数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param obj 要删除的对象
	 * @param connName 表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int remove(Object obj,String connName) throws Exception{
		int result=-1;
		try {
			conn=getConn(connName);
			result= conn.remove(bean2DB(obj)).getN();
		} catch (MongoException e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return result;
	}
	
	/**
	 * 
	 * <b>功能:根据条件删除数据</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param dbObject  要删除的数据
	 * @param connName 表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int remove(DBObject dbObject,String connName)throws Exception {
		int result=-1;
		try {
			conn=getConn(connName);
			result= conn.remove(dbObject).getN();
		} catch (MongoException e) {
			e.printStackTrace();
			throw new Exception();
		}finally{
			destory();
		}
		return result;
	}
	
	/**
	 * 
	 * <b>功能:根据条件得到数据总和</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param dbObject 条件对象
	 * @param connName  表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int getCount(DBObject dbObject,String connName)throws Exception{
		int result=0;
		try {
			conn=getConn(connName);
			result=conn.find(dbObject).count();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception();
		}
		return result;
	}
	
	/**
	 * 
	 * <b>功能:根据条件得到数据总和</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param obj 条件对象
	 * @param connName 表连接名称
	 * @return
	 * @throws Exception int 返回影响结果
	 */
	public int getCount(Object obj,String connName)throws Exception{
		int result=0;
		try {
			conn=getConn(connName);
			result=conn.find(bean2DB(obj)).count();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}
	
	/**
	 * 
	 * <b>功能:将自定义对象转换为Mongo对象</b><br>
	 * <br>
	 * @修改者 ~ dwc, 2012-4-26
	 * @param obj 自定义对象
	 * @return DBObject Mongo对象
	 */
	public static DBObject bean2DB(Object obj)throws Exception{
		DBObject dbObject=new BasicDBObject();
		Class<? extends Object> clazz=obj.getClass();
		Field [] fields=clazz.getDeclaredFields();
		for(Field field:fields){
			String fieldName=field.getName();
			String methodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1,fieldName.length());
			Method method=null;
			Object  resultObj=null;
			try {
				method=clazz.getMethod(methodName);
			} catch (Exception e) {
				e.printStackTrace();
				continue;
			}
			try {
				resultObj=method.invoke(obj);
			} catch (Exception e) {
				continue;
			}
			if(resultObj!=null&&!resultObj.equals("")){
				dbObject.put(fieldName, resultObj);
			}
		}
		return dbObject;
	}
	
	/**
	 * 
	 * <b>功能:将Mongo对象转换为自定义对象</b><br>
	 * <br>
	 * @修改者 ~ 邓万川, 2012-4-26
	 * @param dbObject Mongo对象
	 * @param className 要转换的类名称
	 * @return
	 * @throws Exception Object
	 */
	public static Object DB2Bean(DBObject dbObject,String className) throws Exception{
		Class clazz=Class.forName(className);
		Object obj=clazz.newInstance();
		Field [] fields=clazz.getDeclaredFields();
		for(Field field:fields){
			String fieldName=field.getName();
			String methodName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1,fieldName.length());
			Method method=null;
			Object  resultObj=null;
			try {
				method=clazz.getMethod(methodName,new Class[]{field.getType()});
			} catch (Exception e) {
				e.printStackTrace();
				continue;
			}
			resultObj=dbObject.get(fieldName);
			try {
				resultObj=method.invoke(obj,new Object[]{resultObj});
			} catch (Exception e) {
				continue;
			}
		}
		return obj;
	}
}

 

 

public class Student {
	private Object _id;
	private String name;
	private String age;
	
	
	public Object get_id() {
		return _id;
	}
	public void set_id(Object_id) {
		this._id = _id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	
	
}
 

 

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.swing.text.TabableView;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.bson.BSONObject;
import org.bson.types.ObjectId;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.mongodb.BasicDBObject;
import com.mongodb.Bytes;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import com.mongodb.QueryOperators;
import com.mongodb.util.JSON;


/**
 * 
 * <b>功能:MongoDB测试类</b><br> 
 * <br>
 * <b>完整路径:</b> .MongoTest <br> 
 * <b>创建日期:</b> 2012-4-26 下午2:15:41 <br>
 * @author <a href="mailto:dengwanchuan@shareinfo.com.cn">dwc</a><br>
 *         <a href="http://www.shareinfo.com.cn">Shenzhen Share Info System Co.,Ltd.</a>
 * @version 1.0, 2012-4-26
 */
public class MongoDBTest{
	MongoDBUtil mu=new MongoDBUtil();
	@Test
	public void find(){
		//List<DBObject> list=queryAll(null, "student");
		try {
			Student stu=new Student();
			List<Student> list=mu.findAll(stu,"student",Student.class.getName());
			for (Student result : list) {
					System.out.println("name="+result.getName());
					System.out.println("age="+result.getAge());
					System.out.println("========================");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void add() {
		Student stu=new Student();
		stu.setAge("24");
		stu.setName("tom");
		try {
			mu.add(stu, "stu");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test
	public void update(){
		try {
			Student where=new Student();
			where.setAge("22");
			where.setName("tom");
			
			Student value=(Student) mu.findOne(where, "stu", where.getClass().getName());
			value.setAge("25");
			value.setName("joke");
			System.out.println(mu.update(value,where,"stu"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void remove(){
		try {
			Student where=new Student();
			where.setAge("25");
			where.setName("joke");
			mu.remove(where, "stu");
		} catch (Exception e) {
			e.printStackTrace();
		}
	
	}
}
分享到:
评论
7 楼 AallenXu 2013-06-09  
我直接用您的代码,运行时发现报好多java.lang.NoSuchMethodException...如何解决啊?!!!  不知道现在你还有时间帮助一下不?
6 楼 hyneng 2012-05-30  
dengwanchuan 写道
hyneng 写道
再说一下我遇到的问题。
如果想按测试类MongoDBTest的add-->find-->update-->find-->remove这个流程跑进来,要注意几点。
1.find方法的表名得注意了,要不,添加进去后查看不到添加的数据,student->stu,
List<Student> list=mu.findAll(stu,"student",Student.class.getName());
2.update方法,如果按照where找不到对象,会出现空指针异常,所以 where.setAge("22");  应改为 where.setAge("24");  在此插一句,是不是应该处理这种情况下空针异常的问题



对不起,回复晚了,第二个问题,的确是要处理空指针异常.

写得挺好的
5 楼 dengwanchuan 2012-05-30  
hyneng 写道
再说一下我遇到的问题。
如果想按测试类MongoDBTest的add-->find-->update-->find-->remove这个流程跑进来,要注意几点。
1.find方法的表名得注意了,要不,添加进去后查看不到添加的数据,student->stu,
List<Student> list=mu.findAll(stu,"student",Student.class.getName());
2.update方法,如果按照where找不到对象,会出现空指针异常,所以 where.setAge("22");  应改为 where.setAge("24");  在此插一句,是不是应该处理这种情况下空针异常的问题



对不起,回复晚了,第二个问题,的确是要处理空指针异常.
4 楼 steafler 2012-05-10  
灰常不错呀
3 楼 hyneng 2012-05-05  
再说一下我遇到的问题。
如果想按测试类MongoDBTest的add-->find-->update-->find-->remove这个流程跑进来,要注意几点。
1.find方法的表名得注意了,要不,添加进去后查看不到添加的数据,student->stu,
List<Student> list=mu.findAll(stu,"student",Student.class.getName());
2.update方法,如果按照where找不到对象,会出现空指针异常,所以 where.setAge("22");  应改为 where.setAge("24");  在此插一句,是不是应该处理这种情况下空针异常的问题
2 楼 hyneng 2012-05-05  
还有加以下包:
ezmorph-1.0.2.jar
commons-beanutils-1.7.0.jar
commons-collections-3.2.jar
commons-lang-2.0.jar
commons-logging-1.0.4.jar
1 楼 hyneng 2012-05-04  
赞一个

相关推荐

    NoSQL Manager for MongoDB 下载

    通过使用 "NoSQL Manager for MongoDB",用户能够更高效地管理和操作 MongoDB 数据库,无论是进行日常的数据库维护还是进行项目开发,都能提供极大的便利。对于初学者,这个工具是学习 MongoDB 的理想起点,因为它...

    Java mongodb CRUD 操作代码

    在本文中,我们将深入探讨如何使用Java进行MongoDB的基本CRUD操作,以及如何处理图片的存储、读取和删除。MongoDB是一个流行的NoSQL数据库,它以JSON格式存储数据,而Java是与其交互的常用编程语言。让我们开始探索...

    Springboot整合MongoDB进行CRUD操作的两种方式(实例代码详解)

    Springboot整合MongoDB进行CRUD操作的两种方式 在分布式和微服务架构中,Springboot和MongoDB是非常流行的技术栈。 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库。两者在实际应用中使用...

    MongoDB CRUD技术操作概述.pptx

    MongoDB 是一个流行的 NoSQL 数据库,CRUD(Create、Read、Update、Delete)是 MongoDB 中最基本的四种操作。以下是 MongoDB CRUD 技术操作概述的知识点: 写入(Create) * `insert` 方法:用于将文档插入到集合...

    java操作mongoDB(CRUD)

    Java操作MongoDB主要涉及到的是Java驱动程序与MongoDB数据库之间的交互,这涵盖了创建连接、执行CRUD(创建、读取、更新、删除)操作等一系列基本的数据库管理任务。MongoDB是一个流行的NoSQL数据库,以其灵活性、高...

    NoSQL数据库之MongoDB源码和PPT

    6. ** CRUD操作**:MongoDB提供了创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,这些操作直接针对文档进行,非常直观且高效。 7. **聚合框架**:MongoDB的聚合框架允许开发者进行复杂的分析...

    NoSQL数据库-MongoDB和Redis

    - **交互式Shell**:提供了命令行界面用于执行基本的CRUD操作和管理任务。 #### 五、一般功能 - **插入**:通过`insert`命令向集合中添加文档。 - **查询**:使用`find`命令检索文档。 - **删除**:通过`remove`...

    NoSQL MongoDB 驱动 MongoDBDriver-Release-0.82.2

    MongoDBDriver-Release-0.82.2是针对NoSQL数据库系统MongoDB的一个特定版本的驱动程序包。MongoDB是一种流行的开源、分布式文档数据库,它以JSON格式存储数据,提供高可伸缩性、高性能和灵活性。在这个版本中,我们...

    NoSQL Manager for MongoDB.rar

    - **CRUD操作**:Create(创建)、Read(读取)、Update(更新)和Delete(删除)是MongoDB的基本操作,NoSQL Manager提供了友好的界面进行这些操作。 3. **MongoDB在实际应用中的优势** - **高性能**:MongoDB...

    nodetunes:MongoDB CRUD练习

    "nodetunes" 是一个针对 MongoDB 的 CRUD(创建、读取、更新、删除)操作的实践项目,旨在帮助开发者加深对 MongoDB 和 JavaScript 的使用理解。 在这个项目中,"nodetunes" 涉及到以下关键知识点: 1. **MongoDB ...

    主流NOSQL数据库之MongoDB快速入门.docx

    - **Java操作MongoDB**:介绍如何使用Java语言对MongoDB进行编程操作,包括连接数据库、执行CRUD操作等。 - **Spring集成MongoDB**:通过Spring框架集成MongoDB,利用Spring Data MongoDB简化数据访问逻辑。 #### ...

    mongodb之CRUD小demo

    在本“mongodb之CRUD小demo”中,我们将探讨如何将MongoDB集成到Spring框架中,以便利用Spring提供的强大功能进行数据操作。MongoDB的主要优势在于其灵活性、可扩展性和高性能,而Spring作为Java应用开发的强大框架...

    MongoDB CRUD操作中的插入实例教程

    MongoDB是一个面向文档的NoSQL数据库,它的核心功能之一是CRUD操作,即创建(Create)、读取(Read)、更新(Update)、删除(Delete)。在MongoDB中,插入操作是CRUD中的“创建”部分,它允许我们向数据库中添加新的文档。...

    Java程序对MongoDB数据库进行CRUD操作.pptx

    【Java程序对MongoDB数据库进行CRUD操作】 MongoDB是一种流行的NoSQL(Not Only SQL)非关系型数据库,它的设计思想是面向文档的,适合处理大量结构化和半结构化的数据。与传统的SQL数据库不同,MongoDB不使用表格...

    Linux运维-03-NoSQL数据库之MongoDB-05资料.zip

    6. **CRUD操作**:创建(Create)、读取(Read)、更新(Update)和删除(Delete)是MongoDB的基本操作。MongoDB提供了丰富的查询语言,包括聚合框架和地理空间查询。 7. **备份与恢复**:使用`mongodump`和`...

    php-mongodb-crud:一个简单的 MongoDB 和 PHP CRUD 应用程序

    **PHP与MongoDB CRUD操作详解** 在Web开发中,数据管理是至关重要的,而PHP作为常用的后端语言,经常需要与数据库进行交互。MongoDB是一个流行的NoSQL数据库系统,以其灵活性、可扩展性和高性能受到开发者青睐。本...

    mongoDB非关系型数据库安装以及使用指南

    在shell中,你可以执行CRUD操作(创建、读取、更新、删除)和其他数据库管理任务。 六、MongoDB基本操作 1. 创建数据库:使用`use &lt;database_name&gt;`命令,如果数据库不存在,MongoDB会自动创建。 2. 插入数据:`db....

    NoSql MongoDB权威指南.zip

    在《MongoDB权威指南》中,你将深入了解到如何安装和配置MongoDB,创建数据库、集合和文档,以及如何执行基本的CRUD(创建、读取、更新、删除)操作。此外,还会讲解到更高级的主题,如副本集的配置、分片策略、备份...

Global site tag (gtag.js) - Google Analytics