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,
数据库扫描了整个表,这会造成严重的性能影响。没有使用索引。