Mongodb相关技术分享资料课件.pptx

上传人(卖家):三亚风情 文档编号:2942224 上传时间:2022-06-13 格式:PPTX 页数:79 大小:409.76KB
下载 相关 举报
Mongodb相关技术分享资料课件.pptx_第1页
第1页 / 共79页
Mongodb相关技术分享资料课件.pptx_第2页
第2页 / 共79页
Mongodb相关技术分享资料课件.pptx_第3页
第3页 / 共79页
Mongodb相关技术分享资料课件.pptx_第4页
第4页 / 共79页
Mongodb相关技术分享资料课件.pptx_第5页
第5页 / 共79页
点击查看更多>>
资源描述

1、MongoDB相关技术徐如庆 2013-04-22 概念概念 MongoDB是一个基于分布式文件存储的数据库。由C+语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。特点特点高性能、易部署、易使用,存储数据非常方便。主要功能特性有

2、: 面向集合存储,易存储对象类型的数据。 模式自由。 使用高效的二进制数据存储,包括大型对象(如视频等)。 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C+语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。 文件存储格式为BSON(一种JSON的扩展)。 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。http:/IP:28017/ 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式

3、及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。适用场合适用场合 网站网站数据数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。 缓存缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源 过载。 大尺寸,低价值的数据大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。 高伸缩性的场景高伸缩性的场景:

4、Mongo非常适合由数十或数百台服务器组成的数据库。Mongo已经包含对MapReduce引擎的内置支持。 用于对象及用于对象及JSON数据的存储数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。不适用不适用场合场合 高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。与mysql对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成。 MongoD

5、B是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。 集合相当于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。 下载下载下载地址:http:/www.mongodb.org/downloads下载安装包:官方下载地址单击此处,如果是win系统,注意是64位还是32位版本的,请选择正确的版本。安装与配置安装与配置一、解压缩文件。将压缩包解压,在D盘创建文件夹MongoDB,将压缩包中所有的.exe文件拷到D:MongoDB文件夹中。二、建立工作目录1、建立数据存放目录 D:mongodbdata2、建立日志文件

6、D:mongodblogmongodb.log三、设置系统变量。为了方便从控制台中管理mongodb.找到所有的exe的文件的路径,此为D:MongoDBbin添加到path后面,添加之前加一个“;”;四、将mongdb作为windows服务随机启动控制台中输入:mongod -logpath D:MongoDBlogmongodb.log -logappend -dbpath D:MongoDBdata -directoryperdb -serviceName mongodb223 -install安装与配置安装与配置五、连接mongodb 在控制台中输入net start mongodb2

7、23,会出现 “Mongo DB 服务已经启动成功”的提示。停止:mongodb: net stop mongodb223输入mongo,就会连接到test.在我的电脑-管理-服务和应用程序中可以看到MongoDB 服务已经成功启动安装与配置安装与配置六、shell操作数据库Win下输入 mongo.exe进入如下界面:用户与权限1、基于MongoDB的数据存储没有使用到权限访问(MongoDB默认设置为无权限访问限制) 2、可以通过注册表修改启动项添加-auth设置权限,设置权限后,需要验证通过后才可以操作。注:设置权限后,需要重启服务才有效。用户相关用户相关#增加或修改用户密码db.add

8、User(name,pwd)#查看用户列表db.system.users.find()/admin 权限 #用户认证db.auth(name,pwd) #删除用户db.removeUser(name)#查看所有用户show users普通操作新建集合集:db.createCollection(user); 删除collectiondb.user.drop()删除当前的数据库db.dropDatabase() 增加数据 db.user.insert(uid:1,username:Falcon.C,age:25); var j = name: mongo; db.things.save(j);#存

9、储嵌套的对象db.foo.save(name:ysz,address:city:beijing,post:100096,phone:138,139)#存储数组对象db.user_addr.save(Uid:,Al:test-,test-) 更新数据db.user.update(uid:1,$set:age:26) #age=26db.user.update(uid:1,$inc:age:-1) #age=age-1db.foo.update(yy:5,$set:xx:2,upsert=true,multi=true)注释:db.collection.update( criteria, objN

10、ew, upsert, multi )criteria : update的查询条件,类似sql update查询内where后面的objNew : update的对象和一些更新的操作符(如$,$inc.)等,也可以理解为sql update查询内set后面的upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。 删除数据 #删除yy=5的记录db.foo.remove(yy:5) #删除所有

11、的记录db.foo.remove() 查询#查找所有db.foo.find() #查找一条记录 db.foo.findOne()var mongo = db.things.findOne(name:mongo);print(tojson(mongo);#根据条件检索记录db.things.find(name:mongo)#子对象的查找db.foo.find(address.city:beijing) sortsort用法用法: :db.things.find(tags :economy).sort(ts:-1).limit(10); 1表示为以ts升序排序,若为-1,即为降序排序。等价于:SQ

12、L: select * from things where economy in tags order by ts DESC limit 10 limitlimit用法用法:db.things.find().limit(3); countcount操作操作:db.user_addr.count() distinctdistinctdb.foo.distinct(msg)条件条件操作符操作符$gt : $lt : = $lte: = $ne : !=、 $in : in $nin: not in $all: all $not: 反匹配#”=”操作 db.foo.find(timestamp: $

13、gte : 2)更多的在http:/docs.mongodb.org/manual/reference/operator/type/ 索引索引 MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口。 基础基础索引索引在字段age 上创建索引,1(升序);-1(降序):db.users.ensureIndex(age:1)_id 是创建表的时候自动创建的索引,此索引是不

14、能够删除的。当系统已有大量数据时,创建索引就是个非常耗时的活,我们可以在后台执行,只需指定“backgroud:true”即可。db.t3.ensureIndex(age:1 , backgroud:true) 文档文档索引索引 索引可以任何类型的字段,甚至文档:db.factories.insert( name: wwl, addr: city: Beijing, state: BJ );/在addr 列上创建索引db.factories.ensureIndex( addr : 1 );/下面这个查询将会用到我们刚刚建立的索引db.factories.find( addr: city: Be

15、ijing, state: BJ );/但是下面这个查询将不会用到索引,因为查询的顺序跟索引建立的顺序不一样db.factories.find( addr: state: BJ , city: Beijing ); 组合索引组合索引 跟其它数据库产品一样,MongoDB 也是有组合索引的,下面我们将在addr.city 和addr.state上建立组合索引。当创建组合索引时,字段后面的1 表示升序,-1 表示降序,是用1 还是用-1 主要是跟排序的时候或指定范围内查询的时候有关的。db.factories.ensureIndex( addr.city : 1, addr.state : 1 )

16、;/ 下面的查询都用到了这个索引db.factories.find( addr.city : Beijing, addr.state : BJ );db.factories.find( addr.city : Beijing );db.factories.find().sort( addr.city : 1, addr.state : 1 );db.factories.find().sort( addr.city : 1 ) 唯一唯一索引索引只需在ensureIndex 命令中指定”unique:true”即可创建唯一索引。例如,往表t4 中插入2 条记录:db.t4.ensureIndex(

17、firstname: 1, lastname: 1, unique: true); 强制使用索引强制使用索引hint 命令可以强制使用某个索引。db.t5.find(age:$lt:30).hint(name:1, age:1) 删除删除索引索引/删除t3 表中的所有索引db.t3.dropIndexes()/删除t4 表中的firstname 索引db.t4.dropIndex(firstname: 1) explain执行执行计划计划 MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同

18、时可以针对性优化索引。 db.t5.ensureIndex(name:1) db.t5.ensureIndex(age:1) db.t5.find(age:$gt:45, name:1).explain() cursor : BtreeCursor age_1, nscanned : 0, nscannedObjects : 0, n : 0, millis : 0, nYields : 0, nChunkSkips : 0, isMultiKey : false, indexOnly : false, indexBounds : age : 45,1.7976931348623157e+30

19、8 字段说明:cursor: 返回游标类型(BasicCursor 或 BtreeCursor)nscanned: 被扫描的文档数量n: 返回的文档数量millis: 耗时(毫秒)indexBounds: 所使用的索引isMultiKey :is a boolean. When true, the query uses a multikey index, where one of the fields in the index holds an array.nscannedObjects:Specifies the total number of documents scanned durin

20、g the query.nYields:nYields is a number that reflects the number of times this query yielded the read lock to allow waiting writes execute.indexOnly:indexOnly is a boolean value that returns true when the query is covered by the index indicated in the cursor field.nChunkSkips: nChunkSkips is a numbe

21、r that reflects the number of documents skipped because of active chunk migrations in a sharded system. Typically this will be zero. A number greater than zero is ok, but indicates a little bit of inefficiency.更多参数讲解: http:/docs.mongodb.org/manual/reference/explain/ 开启开启profiling功能功能 有两种方式可以控制 Profi

22、ling 的开关和级别,第一种是直接在启动参数里直接进行设置。启动MongoDB 时加上profile=级别 即可。也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置,Profiler 信息保存在system.profile 中。我们可以通过db.getProfilingLevel()命令来获取当前的Profile 级别,类似如下操作: db.setProfilingLevel(2);上面profile 的级别可以取0,1,2 三个值,他们表示的意义如下:0 不开启1 记录慢命令 (默认为100ms)2 记录所有命令Profile 记录在级别1 时会记录慢命令,

23、那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添加slowms 启动参数配置。第二种是调用db.setProfilingLevel 时加上第二个参数:db.setProfilingLevel( level , slowms )db.setProfilingLevel( 1 , 10 ); 查询查询 Profiling 记录记录 MongoDB Profile 记录是直接存在系统db 里的,记录位置system.profile ,所以,我们只要查询这个Collection 的记录就可以获取到我们的 Profile 记录了。列出执

24、行时间长于某一限度(5ms)的 Profile 记录:db.system.profile.find( millis : $gt : 5 )MongoDB Shell 还提供了一个比较简洁的命令show profile,可列出最近5 条执行时间超过设定时间的 Profile 记录。 Mongo连接连接Mongo mg = new Mongo();无参数时,使用默认的。Host:127.0.01,port:27017Mongo mg = new Mongo(localhost);默认端口为:27017Mongo mg = new Mongo(localhost, 27017);用mongoDB驱动

25、直接开发 获取数据库 DB db = mg.getDB(test);获取名为test的数据库。 获取数据库表DBCollection users = db.getCollection(user);获取test数据库下的user表。用mongoDB驱动直接开发 插入数据 DBObject userObj=new BasicDBObject(); # BasicDBObject实现BSONObject接口; userObj.put(“username”, “张三); userObj.put(“age, “20); users .insert(userObj);用mongoDB驱动直接开发 删除数据

26、DBObject userObj=new BasicDBObject(“username”, “张三); users .remove(userObj);用mongoDB驱动直接开发 修改数据DBObject oldObj=new BasicDBObject(“username”, “张三);DBObject newObj=new BasicDBObject(); newObj.put(“username”, “张三); newObj.put(“age, “80);users . update(oldObj, newObj, true, false);参数说明:oldObj 是update的查询

27、条件,类似sql update查询内where后面的; objNew : update的对象和一些更新的操作符(如$,$inc.)等,也可以理解为sql update查询内set后面的;upsert : 如果不存在update的记录,是否插入newObj,true为插入,默认是false,不插入。 类似 saveOrUptate multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。用mongoDB驱动直接开发 查询DBCollection users = db.getCollection(user); DBCurso

28、r cur = users .find();/ 实现Iterator迭代器接口DBObject object = null;while (cur.hasNext() object = cur.next(); System.out.println(object); / 取出对象中列表为username和age的数据 System.out.println(username: + object.get(“username ) + tupwd:+ object.get(“age)+t_id:+object.get(_id); 用mongoDB驱动直接开发 查询find() Queries for al

29、l objects in this collection.find(DBObject ref) Queries for an object in this collection.findAndModify(DBObject query, DBObject update),找到更新findAndRemove(DBObject query),找到删除findOne() 获取一条findOne(DBObject o)获取一条 Returns a single object from this collection matching the query.getCount()返回总数。createInd

30、ex创建索引, getIndexInfo查询索引,dropIndex删除索引更多api说明: http:/api.mongodb.org/java/2.7.3/用mongoDB驱动直接开发 保持操作在同一个连接中执行:在多个连接中使用。在com.mongodb.DB里有两个重要的方法;requestStart()starts a new consistent request.requestDone()ends the current consistent request“类似其他数据库中在同一个事务里执行。用mongoDB驱动直接开发 根据ObjectId查询:DBCursor cur = c

31、oll.find(new BasicDBObject(_id, new ObjectId(id);/直接用string查不出来 And多条件查询BasicDBObject query = new BasicDBObject(); query.put(intData, intData); query.put(longData, longData); coll.findOne(query); OR多条件查询 BasicDBList cond=new BasicDBList(); cond.add(cond1); cond.add(cond2);query.put($or, cond); 用mong

32、oDB驱动直接开发 NOT查询BasicDBObject query=new BasicDBObject(); BasicDBList cond=new BasicDBList(); cond.add(value1); cond.add(value2); query.put(intData,new BasicDBObject($nin, cond); coll.find(query).count(); 用mongoDB驱动直接开发 查询文档部分列 DBCursor cur = coll.find(new BasicDBObject(),new BasicDBObject(intData,tru

33、e); 查询内嵌文档coll = getCollection(ParentColl); BasicDBObject map = new BasicDBObject(); map.put(innertype,string1); map.put(innerContent,string0); DBCursor cur = coll.find(new BasicDBObject(documentData,map); 用mongoDB驱动直接开发 查询内嵌部分文档 DBCursor cur = coll.find(new BasicDBObject(documentData.innerColumn,“v

34、alue); 查看分页文档DBCursor cur = coll.find().skip(skipNum).limit(pageNum); 查询文档某列是否存在DBCursor cur = coll.find(new BasicDBObject(longData,new BasicDBObject($exists,true); 查询文档排序 DBCursor cur = coll.find().sort(new BasicDBObject(intData,-1);/1:asc / -1:desc distinct查询coll.distinct(documentData.innertype);

35、用mongoDB驱动直接开发 什么是什么是Morphia Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵MongoDB数据库,也让Java程序员可以从复杂数据库设计中脱离出来,从而将更多的精力投入到业务逻辑中去。用mophia开发 特征 它易于使用,而且非常轻巧 ,每种类型使用一次反射。 数据存储(DataStore) 和 DAO 访问抽象,或自己实现. 使用运行时验证的类型安全 (Type-safe)和 Fluent 查询(Query) 支持 基于注解的行为映射,无X

36、ML文件 扩展 : Validation(jsr303) ,以及SLF4J日志 生命周期方法/事件(Lifecycle Method/Event) 支持 可与Guice、Spring和其它DI框架很好整合或协作 很多扩展点(新的注解,转换器,行为映射,日志等) 不存储Null/Empty值(默认) GWT支持(实体仅为POJO) - (GWT忽略注释) 允许原始类型、void toObject(DBObject) 或 DBObject fromObject(Object) fromObject的高级映射器用mophia开发 Morphia开发环境配置 从http:/ http:/ Morphi

37、a 中中Java 注解注解使用使用 IdId 注释指示 Morphia 哪个字段用作文档 ID。如果试图持久保存对象(其 Id 注释的字段为 null),则 Morphia 会自动生成 ID 值。 Entity Entity 注释是必需的。其声明了在专用MongoDB集合上该类作为文档将持久保存。在默认情况下,Morphia 使用类名称来命名集合。例如:Entity(value=hotels, noClassnameStored=true)public class Hotel .public Hotel() .用mophia开发 Entity 其中noClassnameStored的意思是否保

38、存classname,默认情况下保存的。但是一般情况下,我们不需要就不用保存。以下情况下需要保存:Entity(animals) abstract class Animal String name; Entity(animals) Cat extends Animal . Entity(animals) Dog extends Animal . List animals = ds.createQuery(Animal.class).asList(); 用以区别是哪个子类。Entity(value = pps_bookmark, noClassnameStored = true, cap = C

39、appedAt(0)在Entity中CappedAt cap() default CappedAt(0);用mophia开发 Morphia 中中Java 注释使用注释使用 EmbeddedEmbedded 注释说明 Morphia将此对象实例嵌入到另一个对象中去。而不单独的放到一个MongoDB 集合。例如: Embeddedpublic class EmbedEpisode/ 电视剧的剧集为嵌入式的 ReferenceReference 注释说明对象是对另外一个集合中的文档的引用。在从 MongoDB 集合中加载对象时,Morphia 遵循着这些引用来建立对象关系。注意:在被引用之前必须已

40、经保存到mongoDB中。Referenceprivate List categories;/ 分类用mophia开发 Reference引用类型的 不能用“.”操作子查询。比如:public class AssetInfo extends MidEntity Referenceprivate ShowTypeInfo showTypeInfo;query.filter(“showTypeInfo.typeId = ”,“MOVIE”);/是错误的。Can not use dot-notation past源码解释:/* Returns if the MappedField is a Refe

41、rence or Serilized */private static boolean canQueryPast(MappedField mf) return !(mf.hasAnnotation(Reference.class) | mf.hasAnnotation(Serialized.class);用mophia开发 Morphia 中中Java 注释使用注释使用 Indexed 类属性标记Indexed注释, 表明为此属性增加索引。例如: Indexedprivate Integer sort;/ 排序 Indexes&Index 复合indexes可以指定多个字段,该注解是class

42、级别。例如下面代码指定title为默认升序同时type为降序(-表示DESC)例如:Entity(value = pps_asset_info, noClassnameStored = true)Indexes(Index(value = title, -type, unique = true)public class AssetInfo extends MidEntity 用mophia开发 Property 类属性标记 Property注释, 表明为此属性在MongoDB数据库取一个别名。与ejb3-persistence,javax.persistence.Column同样的功能Colu

43、mn(name = description)例如:Property(my_integer) private int myInt; Transient 类属性标记Transient注释则表明这个字段将不被持久化到数据库。用mophia开发 Morphia编程1、定义实体类Entityclass MyEntity Id ObjectId id;String name;用mophia开发 初始化初始化 Morphia/Mongo/连接到本地mongoDB数据库Mongo mongo = new Mongo(localhost);Morphia morphia = new Morphia();/告诉M

44、orphia映射哪些类morphia.mapPackage(MyPackage); /映射对象包 /创建名为“myDB”数据库,mongo最好使用单实例模式 Datastore ds = morphia.createDatastore(mongo ,myDB);ds.ensureIndexes(); /creates indexes from Index annotations in your entitiesds.ensureCaps(); /creates capped collections from Entity,设置容量用mophia开发 保存被持久化类MyEntity e = .;

45、ds.save(e);/将MyEntity对象持久化到mongoDB数据库中。 查询/通过类型取的第一个数据项MyEntity e =ds.find(MyEntity.class).get();MyEntity e = ds.find(MyEntity.class).field(name).equal(someName).get();用mophia开发 Datastore接口介绍 Datastore接口把Java对象保存到MongoDB或从MongoDB中访问Java对象提供了安全类型的方法。它提供了get/find/save/delete方法为你操作Java对象。 Get方法Get方法返回一

46、个实体对象通过Id。get方法只是find(.)方法的一个精简版,通过ID访问。它会返回一个实体对象,或者null如果没有找到的话。Datastore ds = .Hotel hotel = ds.get(Hotel.class, hotelId);用mophia开发 Find方法find方法只是对Query的一个轻量级的封装。 作为封装它将返回一个Query,它实现Iterable和QueryResults接口。 /在循环中使用for(Hotel hotel : ds.find(Hotel.class, stars , 3) print(hotel);/作为一个List返回List hote

47、ls = ds.find(Hotel.class, stars , 3).asList();/对结果排序List hotels = ds.find(Hotel.class, stars , 3).sort(-stars).asList();/返回第一个符合条件的结果Hotel gsHotel = ds.find(Hotel.class, name, Grand Sierra).get();这里是有效的操作符列表=, =, !=, , , =, =, in, nin, all, size, exists。如果没有指定操作符默认使用=, 就像上面的例子,=和“=”是等价的表示相等,!=和是等价的表

48、示不相等。用mophia开发 Save方法 大部分对MongoDB数据库操作的工作及Morphia映射解析工作已由Morphia完成。本方法直截了当,只要我们在定义持久化类时使用好Morphia 注释即可。Hotel hotel = new Hotel();ds.save(hotel);/Id 属性如果没有指定的话,将被自动生成, ObjectId id = hotel.getId();用mophia开发 Delete方法 它已很好的自我解释,delete方法将从MongoDB数据库删除数据项,基于一个查询如id或其它条件。Datastore ds = ./通过指定主键Id,删除数据项ds.d

49、elete(Hotel.class, new ObjectId(Grand Sierra Resort);/基于一个查询,删除数据项ds.delete(ds.createQuery(Hotel.class).filter(pendingDelete, true);在morphia支持mongoDB以原子方式做一些操作的功能。如删除一个实体,并且同时返回要删除的项。 FindAndDelete方法首先查询要删除的项,并且删除。Datastore ds = .Hotel grandSierra = ds.findAndDelete(ds.get(Hotel.class, new ObjectId(

50、Grand Sierra Resort);用mophia开发 Update方法public UpdateResults update(Query q, UpdateOperations ops) 根据q查询出来要更新的数据;利用ops进行设置更新数据;Query q =terminaDao.update(terminaDao.createQuery().field(“id”).equal(new ObjectId(id);UpdateOperations ops =terminaDao.createUpdateOperations().set(“isConnection”, isConnect

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(Mongodb相关技术分享资料课件.pptx)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|