设为首页 收藏本站
查看: 1359|回复: 0

[经验分享] Ubuntu14.04下初步使用MongoDB

[复制链接]

尚未签到

发表于 2017-12-15 09:33:55 | 显示全部楼层 |阅读模式
  不多说,直接上干货!

Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐)

shell命令模式
  输入mongo进入shell命令模式,默认连接的数据库是test数据库,在此之前一定要确保你已经启动了MongoDB,否则会出现错误,启动之后运行成功,如下截图:
DSC0000.png

  

root@zhouls-virtual-machine:~#mongo  
MongoDB shell version:
2.4.9  
connecting to: test
  

>   

  或者以这种方式来连接
DSC0001.png

  

root@zhouls-virtual-machine:~# mongo 192.168.80.31:27017/admin -u root -p root  
MongoDB shell version:
2.4.9  
connecting to:
192.168.80.31:27017/admin  

>   


mongo常用操作命令:
  数据库相关 (这只是部分而已)
  

show dbs:显示数据库列表  
show collections:显示当前数据库中的集合(类似关系数据库中的表table)
  
show users:显示所有用户
  
use yourDB:切换当前数据库至yourDB
  
db.help() :显示数据库操作命令
  
db.yourCollection.help() :显示集合操作命令,yourCollection是集合名
  

  注意:MongoDB没有创建数据库的命令,如果你想创建一个“School”的数据库,先运行use School命令,之后做一些操作(如:创建聚集集合db.createCollection('teacher')),这样就可以创建一个名叫“School”的数据库。截图如下:
DSC0002.png

  

root@zhouls-virtual-machine:~# mongo 192.168.80.31:27017/admin -u root -p root  
MongoDB shell version:
2.4.9  
connecting to:
192.168.80.31:27017/admin  

> show dbs  
admin   
0.203125GB  
local   
0.078125GB  
test   
0.203125GB  

> use school  
switched to db school
  

> db.createCollection('teacher')  
{
"ok" : 1 }  

> show dbs  
admin   
0.203125GB  
local   
0.078125GB  
school   
0.203125GB  
test   
0.203125GB  

>   

  下面以一个School数据库为例,在School数据库中创建两个集合teacher和student,并对student集合中的数据进行增删改查基本操作(集合Collection相当于关系型数据库中的表table)。
  1、切换到School数据库
  

use School     #切换到School数据库。MongoDB 无需预创建School数据库,在使用时会自动创建  

  刚上面,我已经创建好了。
  2、创建Collection
  

db.createCollection('teacher')       #创建一个聚集集合。MongoDB 其实在插入数据的时候,也会自动创建对应的集合,无需预定义集合  

  刚上面,我已经创建好了。
DSC0003.png

  

> show collections  
system.indexes
  
teacher
  

>   

  这样就显示,在teacher数据库里,创建集合(即关系型数据库里叫表),成功!
  3、插入数据
  与数据库创建类似,插入数据时也会自动创建集合(即关系型数据库里的表)。
  插入数据有两种方式:insert和save。
  

db.student.insert({_id:1, sname: 'zhangsan', sage: 20})       #_id可选  
db.student.save({_id:
1, sname: 'zhangsan', sage: 22})        #_id可选  

  这两种方式,其插入的数据中_id字段均可不写,会自动生成一个唯一的_id来标识本条数据。
  而insert和save不同之处在于:在手动插入_id字段时,如果_id已经存在,insert不做操作,save做更新操作;如果不加_id字段,两者作用相同都是插入数据。
  截图如下:  
DSC0004.png

  

> db.student.insert({_id:1, sname: 'zhangsan', sage: 20})  

> db.student.find()  
{
"_id" : 1, "sname" : "zhangsan", "sage" : 20 }  

> db.student.save({_id:1, sname: 'zhangsan', sage: 22})  

> db.student.find()  
{
"_id" : 1, "sname" : "zhangsan", "sage" : 22 }  

> db.student.insert({_id:1, sname: 'zhangsan', sage: 25})  
E11000 duplicate key error index: school.student.$_id_  dup key: { :
1.0 }  

> db.student.find()  
{
"_id" : 1, "sname" : "zhangsan", "sage" : 22 }  

>   

  添加的数据其结构是松散的,只要是bson格式均可,列属性均不固定,根据添加的数据为准。先定义数据,再插入,就可以一次性插入多条数据,截图如下:
DSC0005.png

DSC0006.png

  

> s = [{sname:'lisi',sage:20},{sname:'wangwu',sage:20},{sname:'chenliu',sage:20}]  
[
  
{
  

"sname" : "lisi",  

"sage" : 20  
},
  
{
  

"sname" : "wangwu",  

"sage" : 20  
},
  
{
  

"sname" : "chenliu",  

"sage" : 20  
}
  
]
  

> db.student.insert(s)  

> db.student.find()  
{
"_id" : 1, "sname" : "zhangsan", "sage" : 22 }  
{
"_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 }  
{
"_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 }  
{
"_id" : ObjectId("59316b5eaf2276c698170fb0"), "sname" : "chenliu", "sage" : 20 }  

>   

  运行完以上例子,student集合已自动创建,这也说明 MongoDB 不需要预先定义 collection ,在第一次插入数据后,collection 会自动的创建。截图如下:
DSC0007.png

  

> show collections  
student
  
system.indexes
  
teacher
  

>   

  4、查找数据
  db.youCollection.find(criteria, filterDisplay)
  criteria :查询条件,可选
  filterDisplay:筛选显示部分数据,如显示指定列数据,可选(当选择时,第一个参数不可省略,若查询条件为空,可用{}做占位符,如下例第三句
  

db.student.find()    #查询所有记录。相当于:select * from student  
db.student.find({sname:
'lisi'})      #查询sname='lisi'的记录。相当于: select * from student where sname='lisi'  
db.student.find({},{sname:
1, sage:1})     #查询指定列sname、sage数据。相当于:select sname,sage from student。sname:1表示返回sname列,默认_id字段也是返回的,可以添加_id:0(意为不返回_id)写成{sname: 1, sage: 1,_id:0},就不会返回默认的_id字段了  
db.student.find({sname:
'zhangsan', sage: 22})     #and 与条件查询。相当于:select * from student where sname = 'zhangsan' and sage = 22  
db.student.find({$or: [{sage:
22}, {sage: 25}]})     #or 条件查询。相当于:select * from student where sage = 22 or sage = 25  

  查询操作类似,这里只给出db.student.find({sname: 'lisi'})查询的截图,如下:
DSC0008.png

  

> db.student.find({sname: 'lisi'})  
{
"_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 }  

>   

  5、修改数据
  db.youCollection.update(criteria, objNew, upsert, multi )
  criteria: update的查询条件,类似sql update查询内where后面的
  objNew : update的对象和一些更新的操作符(如$set)等,也可以理解为sql update查询内set后面的。
  upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  multi: mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。默认false,只修改匹配到的第一条数据。
  其中criteria和objNew是必选参数,upsert和multi可选参数
  举例如下:
  

db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true)     #相当于:update student set sage =30 where sname = 'lisi';  

DSC0009.png

  

> db.student.find({sname: 'lisi'})  
{
"_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 }  

> db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true)  

> db.student.find({sname: 'lisi'})  
{
"_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 }  

>   

  

  

  6、删除数据
  

db.student.remove({sname: 'chenliu'})     #相当于:delete from student where sname='chenliu'  

DSC00010.png

  

> db.student.find()  
{
"_id" : 1, "sname" : "zhangsan", "sage" : 22 }  
{
"_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 }  
{
"_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 }  
{
"_id" : ObjectId("59316b5eaf2276c698170fb0"), "sname" : "chenliu", "sage" : 20 }  

> db.student.remove({sname: 'chenliu'})  

> db.student.find()  
{
"_id" : 1, "sname" : "zhangsan", "sage" : 22 }  
{
"_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 }  
{
"_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 }  

>   

  6、退出shell命令模式
  输入exit或者Ctrl+C退出shell命令模式
DSC00011.png

  扩展学习
  1、安装:
  mongod -dbpath /home/xxlong/myInstall/mongodb_data
  默认是在
  

dbpath=/var/lib/mongodb  

  mongod 启动数据库进程
  --dbpath 指定数据库的目录
  --port 指定数据库的端口,默认是27017
  --bind_ip 绑定ip
  --directoryperdb 为每个db创建一个独立的子目录
  --logpath 指定日志存放目录,默认是控制台
  --auth 用安全认证方式启动数据库
  --config 指定启动项用文件的路径
  --fork 用守护进程的方式启动mongodb
  --rest:是打开web监控页面,比如我们这里监听10001端口,则打开http://10.1.49.225:11001/就可以看到这个mongodb数据库进程的信息
  关闭:1、ctrl+c 2、db.shutdownServer()
  2、mongodb客户端工具:
  mongo 127.0.0.1/27017/admin 不填,默认连接本机test数据库。
  1、查看数据库
  show dbs
  2、创建数据库
  use xxlong:系统自动创建一个数据库(xxlong)。如果use之后没有创建 任何集合。系统就会删除这个数据库。
  3、给定数据库添加集合(student)并添加记录(insert)
  db.[documentName].insert({...});
  db.student.insert({_id:13,name:'Cat',sex:1,age:23,score:[60,71,81,91,100]});
  批量增加:for(var i=1;i<10;i++){
  db.student.insert({_id:i,name:'xxl',age:i});
  }
  insert在_id相同的时候会报错,而save则不报错,而是更新
  db.student.save({_id:13,name:'xxlong'});
  4、查看数据库中的所有集合
  show collections;
  5、查看定制文档的数据
  db.student.find();查看所有数据
  db.student.findOne();查看第一条数据
  6、更新文档(相当于传统数据库的记录)数据
  db.student.update({_id:10},{$set:{age:21}});id为10的文档的age改为21,$set表示有这个键则修改,没有这个键则增加
  db.student.update({age:10},{$set:{sex:1}},true,true),这个true表示查到年龄为10则修改, 查不到则插入,false表示为查到则修改,查不到什么也不做,不写则默认为false(相当于
  InsertOrUpdate);这个true表示批量增加(所有年龄为10,修改性别为1),false则不是批量增加,默认为false;
  db.student.update({_id:10},{$inc:{age:1}});id为10的文档的age自动加1
  db.student.update({_id:10},{$unset:{age:x}});删除id为10的文档的age字段,x为任意数字
  db.student.update({_id:13},{$push:{score:[100,101]}});score数组中新增值100,101
  如果score键不存在,则新增加这个键,必须为数组
  db.student.update({_id:13},{$pop:{score:x}});删除数组中的值,x为1删除最后一个,x为-1 删除最前的一个
  db.student.update({_id:3},{$pull:{course:"computer"}}); 删除数组course中的computer值(可以为多个computer值)
  db.student.update({_id:3},{$pullAll:{course:["math","english"]}}); 删除数组中多个不同的值
  db.student.update({_id:10},{$rename:{'age':'AGE'}});修改id为10的文档的age字段名
  db.student.update({_id:3},{$set:{course:['math','computer']}})
  db.student.update({_id:1},{$addToSet:{course:'math'}})结果:math,computer
  db.student.update({_id:1},{$addToSet:{course:'english'}})结果:math,computer,english
  addToSet:目标数组存在新增加的项则不增加,不存在则增加(数组中有math,computer,再update math时不增加,而update english时,数组中没有english,则增加)
  db.student.update({"_id":3},{$addToSet:{course:{$each:
["math","english","Chinese"]}}}); 批量增加

  7、删除文档数据
  db.student.remove({_id:10});删除id为10的文档的数据。
  8、删除库中的集合
  db.student.drop();
  9、删除数据库
  db.dropDatabase();
  10、Shell的help
  db.help();查看操作数据库的方法
  db.student.help();查看操作集合的(student)方法
  11、mongodb的api
  http://api.mongodb.org/js/2.1.2/index.html
  12、数据库和集合命名规范
  1、不能是空字符串
  2、不能含有‘ ’、(空格)、,、$、/、\、和\O(空字符)
  3、应全部小写
  4、最多64个字节
  5、数据库名不能与现有系统保留库同名。如admin,config,local
  13、ecllipse中装入mongodb插件
  help-->install new soft-->add-->Mongodb,http://www.jumperz.net/update/
  14、查找db.[documentName].find({条件},{键指定})
  查找所有年龄在25至27岁之间的学生

  db.student2.find({"age":{$lte:27,$gte:25}},{"_id":0,"name":1,"age":1}); _id=0表示不显示>  查找所有不是美国的学生
  db.student.find({"Country":{$ne:"USA"}},{"_id":0,"name":1,"Country":1});
  查询所有是美国和中国的学生
  db.student.find({"Country":{$in:["USA","China"]}},{"_id":0,"name":1,"Country":1});
  查询所有不是美国和中国的学生
  db.student2.find({"Country":{$nin:["USA","China"]}},{"_id":0,"name":1,"Country":1});
  查询所有数学成绩大于65或者英语成绩小于95的学生
  db.student.find({$or:[{"Math":{$gt:65}},{"English":{$lt:95}}]},
  {"_id":0,"name":1,"Math":1,"English":1});
  查询所有性别为空的学生
  db.student.find({"sex":{$in:[null]}},{"_id":0,"name":1});
  查询所有名字为To的学生
  db.student.find({"name":/To/},{"_id":0,"name":1});
  查询所有学生名字不含字母a的学生
  db.student.find({"name":{$not:/a/}},{"_id":0,"name":1});
  查询数组book中有java和c++的学生信息
  db.student.find({"book":{$all:["java","C++"]}},{"_id":0,"name":1});
  查询数组第二个值是java的学生信息
  db.student.find({"book.1":"java"},{"_id":0,"name":1})
  查询数组长度是2的学生信息
  db.student.find({"book":{$size:2}},{"_id":0,"name":1});
  查询名字含T的所有学生的书的数组的长度(游标)
  var student = db.student2.find({"name":/T/});
  while(student.hasNext()){print(student.next().book.length)};
  查询学生的book数组中从下标1开始起共2个即book[1],book[2]
  db.student2.find({"name":"Tom5"},{"_id":0,"name":1,"book":{$slice:[1,2]}})
  查询学生的book数组中最后一个元素
  db.student2.find({"name":"Tom5"},{"_id":0,"name":1,"book":{$slice:-1}})
  查询前五条数据
  db.student2.find({},{"_id":0,"name":1}).limit(5);
  查询从第七条开始后三条数据即第7,8,9
  db.student2.find({},{"_id":0,"name":1}).limit(3).skip(6);
  查询的结果按年龄正序排序
  db.student2.find({},{"_id":0,"name":1,"age":1}).sort({age:1});
  查询的结果按年龄逆序排序
  db.student2.find({},{"_id":0,"name":1,"age":1}).sort({age:-1});
  快照的使用
  db.student2.find({$query:{"name":"Tom5"},snapshot:true},{"_id":0,"name":1});
  15、索引
  var start = new Date();
  for(var i=0;i<20000;i++){
  db.student.insert({"number":i,"name":"student"+i});
  }
  var end = new Date();
  print((end-start)+"ms");
  建立索引,查找速度变快1是正序创建索引(正序:越早的创建时间),-1为倒序创建索引(逆序:越迟的创建时间)
  db.student.ensureIndex({"number":1});
  var start = new Date();
  db.student.find({"number":15997});
  var end = new Date();
  print((end-start)+"ms");
  索引的创建在提高查询性能的同时会影响插入的性能。对于经常查询少插入的文档可以考虑用索引。
  创建逆序索引name,并指定该索引名字为studentname
  db.student.ensureIndex({"name":-1},{"name":"studentname"});
  创建唯一索引name
  db.student.ensureIndex({"name":1},{"unique":true});
  如果集合中已经有重复的文档,踢出重复值
  db.student.ensureIndex({"name":1},{"unique":true,"dropDups":true}) ;
  指定查询所使用的索引(name正序索引),指定索引必须是创建好的索引
  db.student.find({"name":"student333"}).hint({"name":1});
  查看本次查询所使用的索引和查询数据的状态信息
  db.student.find({"name":"student333"}).explain();
  查看索引
  db.system.indexes.find();
  或db.system.namespaces.find();
  不锁表创建索引
  db.student.ensureIndex({"name":1},{"unique":true,"background":true})
  删除索引
  db.runCommand({"dropIndexes":"student",index:"name_1"});
  批量删除
  db.runCommand({"dropIndexes":"student",index:"*"});
  db.map.find():
  { "_id" : ObjectId("55ae30a55e9fc03a8994fb34"), "gis" : { "x" : 185, "y" : 150 } }
  创建2d索引,默认会建立[-180,180]的索引
  db.map.ensureIndex({"gis":"2d"},{"min":-1,"max":200});
  查询离点{70,180}最近的三个点
  db.map.find({"gis":{$near:[70,180]}},{"gis":1,"_id":0}).limit(3);
  查询以点(50,50)和点(190,190)为对角线的正方形中所有的点
  db.map.find({"gis":{$within:{$box:[[50,50],[190,190]]}}},{"_id":0,"gis":1})
  查询以(65,80)为点半径为50的圆内的点
  db.map.find({"gis":{$within:{$center:[[65,80],50]}}},{"_id":0,"gis":1})
  16、查询结果的个数
  db.student.find().count();
  去重操作
  db.runCommand({distinct:”persons”,key:”country”}).values
  Group使用
  查询服务器版本号和主机操作系统
  db.runCommand({buildInfo:1});
  查询集合详细信息,大小,空间,索引
  db.runCommand({collStats:"student"});
  查看mongodb命令
  db.listCommands();
  http://localhost:28017/_command
  查看操作本集合最后一次错误信息
  db.runCommand({getLastError:”student”})
  17、 固定集合
  1、固定集合默认是没有索引的就算是_id也是没有索引的
  2、由于不需分配新的空间,它的插入速度是非常快的
  3、固定集合的顺序是确定的,导致查询速度是非常快的
  4、最适合的是应用就是日志管理
  5、创建固定集合
  创建一个新的固定集合,大小是100字节,可以存储文档十个。
  db.createCollection("myColl",{size:100,capped:true,max:10});
  6、将一个普通集合转为一个固定集合。
  db.runCommand({"convertToCapped":"student","size":10000});
  7、反向排序,默认是插入顺序排序
  db.student.find().sort({$natural:-1});
  8、尾部游标,可惜shell不支持,java和php等驱动是支持的
  18、文件GridFS
  1、上传一个文件(将/home/xxlong/xxlong.txt上传到数据库中,并重新命名为b.txt)
  控制台(/bin/bash)mongofiles -d xxlong_db -l "/home/xxlong/xxlong.txt" put "b.txt"
  2、查看GridFS的文件存储状态
  show collections;
  ====>
  fs.chunks
  fs.files
  db.fs.chunks.find();
  ===>{ "_id" : ObjectId("55af7b9e9199bc7fc2000002"),
  "files_id" : ObjectId("55af7b9e9199bc7fc2000001"),
  "n" : 0,
  "data" : BinData(0,"eHhsb25nIGxvbmcgaGVsbG8KMzExID
  U2NyB5dWFuYmEKeHhsICB4aWFvCm
  xvbmcJemkKdWVzdGMKCg==") }
  db.fs.files.find();
  ===>{ "_id" : ObjectId("55af7b9e9199bc7fc2000001"),
  "chunkSize" : 261120,
  "uploadDate" : ISODate("2015-07-22T11:16:46.928Z"),
  "length" : 58,
  "md5" : "99eaa1494edf301e2c9bf51aee7f989e",
  "filename" : "b.txt" }
  查看文件内容
  控制台:mongofiles -d xxlong_db get "b.txt" shell无法打开
  查看所有文件
  控制台:mongofiles -d xxlong_db list
  删除已经存在的文件
  控制台:mongofiles -d xxlong_db delete "b.txt"
  19、服务器端运行eval
  db.eval("function(name){return name}","xxl");
  输出:xxl
  20、保存js全局变量,system.js是一个特殊的集合
  db.system.js.insert({"_id":"show_name","value":"xxlong"}) ;
  db.eval("return show_name") ===>xxlong
  21、导出数据
  打开控制台(/bin/bash)
  -d 指定要导出的库
  -c 指定要导出的库的集合
  -o 数据导出后存放的路径
  -cvs指定导出的cvs格式
  -q过滤导出
  --type<json|csv|tsv>
  切换到数据库目录下:
  控制台:mongoexport --host 127.0.0.1 --port 27017  -d xxlong_db -c student -o /home/xxlong/xxl.json
  22、导入数据
  mongoimport -d xxlong_db -c student --file /home/xxlong/xxl.json
  切换到数据库目录下:
  控制台:mongoimport --host 127.0.0.1 --port 27017 -d xxlong_db -c student110 --file "/home/xxlong/xxlong.json"
  23、运行时备份
  导出127.0.0.1服务下的27017的数据库xxlong数据库
  切换到数据库目录下:
  控制台:mongodump --host 127.0.0.1:27017 -d xxlong_db -o /home/xxlong/
  /home/xxlong 目录下是数据库名(xxlong_db)的文件夹,里面是备份的数据
  24、运行时恢复
  切换到数据库目录下:
  控制台:mongorestore --host 127.0.0.1:27017 -d xxlong_db /home/xxlong/xxlong_db
  25、上锁
  上锁可以是缓冲区中的数据全部放到数据库中
  db.runCommand({fsync:1,lock:1})
  26、解锁
  db.fsyncUnlock();
  27、数据修复
  当停电等不可逆转灾难来临的时候,由于mongodb的存储结构导致会产生垃圾数据,在数据恢复以后这垃圾数据依然存在,这是数据库提供一个自我修复的能力。
  db.repairDatabase();

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424266-1-1.html 上篇帖子: MongoDB 概念解析 下篇帖子: MongoDB Java 连接配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表