【MongoDB】导入CSV文件

1.导入CSV文件 

mongo shell提供了一种具有对javascript语言和标准函数的完全访问权限的Javascript环境。
他为MongoDB数据库提供了一个完整接口。
存储和检索数据的两种方式:嵌入和引用。
6.1基本查询。
1.以管理员身份打开CMD;
c:>c:\practicalmongodb\bin\mongod.exe   --默认监听27017端口的所有入站连接。
2.创建一个CSV文件。
vi exporteg.csv 
Name ,Gender,Class,Score,Age 
"S1","M","C1",95.0,25.0
"S2","M","C1",95.0,25.0
"S3","M","C1",95.0,25.0
"S4","M","C1",95.0,25.0
"S5","M","C1",95.0,25.0
"S6","M","C1",95.0,25.0
"STUDENT1","F","Chemistry",95.0,25.0
"STUDENT2","F","Chemistry",95.0,25.0
"STUDENT3","F","Chemistry",95.0,25.0


3.导入数据。
以管理员身份打开CMD 
c:>c:\practicalmongodb\bin\mongoimport.exe --help 查看帮助
c:>c:\practicalmongodb\bin\mongoimport.exe --host localhost -db mydb --collection importeg --type csv --file c:\exporteg.csv --headerline 

检查mydb数据库是否被创建,importeg集合是否被创建。
c:>c:\practicalmongodb\bin\mongo.exe 
SQL>use mydb 
SQL>show collections     --查看集合。
SQL>db.importeg.find()    --查看所有的文档。
SQL>db  --显示当前shell连接的数据库。
SQL>help   --任何时候可以时候用help来获取帮助。
SQL>db.help   -- 查看数据库上的方法
SQL>db.mycoll.help()  --查看集合上的方法
SQL>sh.help()    --sharding 助手
SQL>rs.help()  --复制集助手
SQL>help admin   --管理帮助 
SQL>help connect  --连接到数据库的帮助 
SQL>help keys  --keys的方法
SQL>help misc  --其他事项
SQL>help mr --mapreduce 
SQL>show dbs  --查看所有的数据库。
SQL>show collections --查看所有集合
SQL>show users   --查看当前数据库的所有用户。
SQL>exit 退出。

SQL>db.addUser(用户文档)
SQL>db.shutdownServer() 
SQL>db.stats() 
SQL>db.version()   

2.SQL 和 mongodb的对比 

SQL 和MongoDB的对比。
SQL                           MONGODB 
数据库                        数据库 
表                           集合
行                           文档
列                           字段
索引                         索引
表内联结                     嵌入和引用 
主键:可以指定一列或列的集合  主键:自动设置到_id字段。

MongoDB只有在将数据插入到数据库时才会创建该数据库。若数据库不存在,use命令不会创建。
这与MongoDB用于数据助益,动态命名空间分配以及简化和加速的开发过程的动态方式是一致的。

3.mongodb的基本使用

如下是一个名为users的多态集合。
{id:ObjectID(),FName:"FirstName",LName:"LastName",Age:30,Gender:"M",Country:"Country"}
{id:ObjectID(),FName:"Full name",Age:30,Gender:"M",Country:"Country"}
{id:ObjectID(),FName:"Full name",Age:30}

SQL>db  --查看当前数据库。
SQL>user1={FName:"Test",LName:"User",Age:30,Gender:"M",Country:"US"}
SQL>user2={FName:"Test User",Age:45,Gender:"F",Country:"US"}
SQL>db.users.insert(user1)
SQL>db.users.insert(user2)
SQL>show dbs  --查看数据库 
SQL>show collections  --查看集合 

system.indexes集合也会与users集合一起显示,system.indexes集合会在数据库被创建时默认创建。它管理数据库中所有集合
的所有索引的信息。
SQL>db.users.find()   --查看该集合所有文档。


所有的文档必须具有一个唯一的_id字段。如果没有显示指定,那么MongoDB同样会自动分配一个唯一对象ID;
默认情况下会在ID字段上创建索引。

SQL>db.system.indexes.find()   查看索引信息。

ensureIndex() 添加索引。
dropIndex()删除索引

4.创建集合并进行操作 

显示创建集合。
SQL>db.createCollection("users")

6.1.3使用循环插入文档。
SQL>for(var i=1;i<=20;i++) db.users.insert({"Name":"Test User"+i,"Age":10+i,"Gender":"F","Country":"India"})
SQL>db.users.find()  --查看所有的文档。

--默认find显示20条。如果有更多的,可以使用it进行翻页显示。
SQL>it  --查看下一个20行。

6.1.4显示指定_id进行插入。--指定的ID 需要具有唯一性。
SQL>db.users.insert({"_id":10,"Name":"explicit id"})    

6.1.5更新。
SQL>db.users.update({"Gender":"F"},{$set:{"Country":"UK"}})  --默认只会更新第一个查询到的记录。
SQL>db.users.find({"Gender":"F"})  --查看女生。
SQL>db.users.update({"Gender":"F",{$set:{"Country":"UK"}},{multi:true}})  --使用multi选项更新所有匹配的记录。
SQL>db.users.find({"Gender":"F"})
SQL>it   --可以每20个文档一查看。

6.1.6删除。
SQL>db.users.remove({"Gender":"M"})  --删除男性 
SQL>db.users.find({"Gender":"M"}) 

SQL>db.users.remove()  --删除所有。
SQL>db.users.find() 
SQL>db.users.drop()  --删除该集合 
SQL>show collections   --查看集合 

6.1.7 读取
SQL>user1={FName:"Test",LName:"User",Age:30,Gender:"M",Country:"US"}
SQL>user2={FName:"Test User",Age:45,Gender:"F",Country:"US"}
SQL>db.users.insert(user1)
SQL>db.users.insert(user2)
SQL>for (var i=1;i<=20;i++) db.users.insert({"Name":"Test User"+i,"Age":10+i,"Gender":"F","Country":"India"})
SQL>db.users.find()  --查询所有的文档
SQL>db.users.find({})  --查询所有的文档

5.查询文档

1.查询文档
一个查询文档可以包含选择器和投影器。
选择器就像SQL中的where条件或者一个用于过滤出结果的过滤器。
投影器就像选择条件或用于显示数据字段的选择列表

2.选择器 
SQL>db.users.find({"Gender":"F"}) --查看所有女性 
SQL>db.users.find({"Gender":"F",$or:[{"Country":"India"}]}) --查询印度女生
SQL>db.users.find({"Gender":"F",$or:[{"Country":"India"},{"Country":"US"}]})--查看来自美国和印度的女生
SQL>db.users.find({"Gender":"F",$or:[{"Country":"India"},{"Country":"US"}]}).count() --查看来自美国和印度的女生总数
SQL>db.users.find().count()   --所有集合中文档的数量。

3.投影器。
SQL>db.users.find({"Gender":"F"},{"Name":1,"Age":1})--显示所有女生的年龄和名字。
SQL>it  --查看更多
4.sort() 
mongodb中升序使用1,降序使用-1;
SQL>db.users.find({"Gender":"F"},{"Name":1,"Age":1}).sort({"Age":1})--所有女生名字和年龄并按年龄升序排序。
SQL>db.users.find({"Gender":"F"},{"Name":1,"Age":1}).sort({"Name":-1,"Age":1}) --按名字降序,按年龄升序。

5.limit() 
SQL>db.users.find({"Gender":"F",$or:[{"Country":"India"},{"Country":"US"}]}).limit(2) --印度或美国女生取2条。
6.skip()
--跳过前两个取第三第四个。
SQL>db.users.find({"Gender":"F"},$or:[{"Country":"India"},{"Country":"US"}]).limit(2).skip(2)
7.findOne()
findOne()命令类似于find()命令,findOne()方法可以使用与find()一样的参数,但不同于返回一个游标。
它会返回单个文档。
SQL>db.users.findOne({"Gender":"F"},{"Name":1,"Age":1}) --返回第一个。
SQL>db.users.findOne()  --返回集合中第一个文档。
8.使用游标。
while循环操作游标。
SQL>var c=db.users.find({"Country":"US"})
SQL>while(c.hasNext()) printjson(c.next())

hasNext()函数判断下一个文档是否存在。next()返回下一个文档。

--被分配给游标对象的变量还可以作为数组来操作。
SQL>var c=db.users.find({"Country":"US"})
SQL>printjson(c[1]) --显示数组索引1的文档。

6.查看Mongodb的执行计划

9.explain() 
explain()函数可以用于查看在执行一个查询时mongodb数据库当前运行的步骤。
explain()的模式分为:allPlansExecution,executionStats,queryPlanner;
默认是使用:queryPlanner
SQL>db.users.find({"Name":"TestUser"}).explain("allPlansExecution")
 db.users.find({"Name":"Test User"}).explain("allPlansExecution")
{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "myprocdb.users",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"Name" : {
				"$eq" : "Test User"
			}
		},
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"Name" : {
					"$eq" : "Test User"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 0,
		"executionTimeMillis" : 0,
		"totalKeysExamined" : 0,
		"totalDocsExamined" : 20,
		"executionStages" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"Name" : {
					"$eq" : "Test User"
				}
			},
			"nReturned" : 0,
			"executionTimeMillisEstimate" : 0,
			"works" : 22,
			"advanced" : 0,
			"needTime" : 21,
			"needYield" : 0,
			"saveState" : 0,
			"restoreState" : 0,
			"isEOF" : 1,
			"invalidates" : 0,
			"direction" : "forward",
			"docsExamined" : 20
		},
		"allPlansExecution" : [ ]
	},
	"serverInfo" : {
		"host" : "itpuxdb1",
		"port" : 27017,
		"version" : "4.0.2",
		"gitVersion" : "fc1573ba18aee42f97a3bb13b67af7d837826b47"
	},
	"ok" : 1
}

正如上面显示的,explain输出结果会返回关于queryPlanner,executionStats,serverInfo

7.查看使用索引后的执行计划

使用索引。
索引被用于为频繁使用的查询提供高性能读取操作。默认情况下,当一个集合被创建并且添加
文档到其中时,就会在该文档的_id字段上创建一个索引。
现象我们创建一个不同类型的索引。

sql>for (i=0;i<1000000;i++){db.testindx.insert({"Name":"user"+i,"Age":Math.floor(Math.random()*120)})}
sql>db.testindx.find({"Name":"user101"}).explain("allPlansExecution")

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "myprocdb.testindx",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"Name" : {
				"$eq" : "user101"
			}
		},
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"Name" : {
					"$eq" : "user101"
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 1,
		"executionTimeMillis" : 405,
		"totalKeysExamined" : 0,
		"totalDocsExamined" : 1000000,
		"executionStages" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"Name" : {
					"$eq" : "user101"
				}
			},
			"nReturned" : 1,
			"executionTimeMillisEstimate" : 0,
			"works" : 1000002,
			"advanced" : 1,
			"needTime" : 1000000,
			"needYield" : 0,
			"saveState" : 7812,
			"restoreState" : 7812,
			"isEOF" : 1,
			"invalidates" : 0,
			"direction" : "forward",
			"docsExamined" : 1000000
		},
		"allPlansExecution" : [ ]
	},
	"serverInfo" : {
		"host" : "itpuxdb1",
		"port" : 27017,
		"version" : "4.0.2",
		"gitVersion" : "fc1573ba18aee42f97a3bb13b67af7d837826b47"
	},
	"ok" : 1
}

--"totalDocsExamined" : 1000000,
数据库扫描了整个表,这会造成严重的性能影响。没有使用索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值