Mongodb学习

本文详细介绍了MongoDB的安装、GUI操作界面使用,包括启动数据库到Windows服务、命令行远程登录等。还阐述了MongoDB的基本命令,如创建库、表,插入、查询、删除和修改数据等,以及深入查询表达式和游标操作。此外,对索引的创建、查看、删除等操作也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mongodb安装和GUI操作界面

官网下载3.6.12版本,下一步下一步安装就行

启动数据库到windows服务

mongod --dbpath D:\ProgramFiles\MongoDB\db --logpath D:\ProgramFiles\MongoDB\log\m17.log --port 27017 --serviceName MongoDB --install

fork后台运行,3.6版本fork命令不支持了
默认端口27017

命令行远程登录

mongo.exe ip:端口/db名称 -u用户名 -p
然后输入用户的密码

 

du -h linux下查看磁盘占用


 

mongodb命令说明

bsondump 导出bson结构

mongo 客户端(相当于mysqlexe)

mogod服务器端(相当于mysqldexe)

mongodump数据库尔二进制导出mysqldump

mongoexport导出易识别的json或csv

mongorestore数据库整体导入

mongos路由器分片

 


 

mongodb入门命令
1.查看当前数据库 show dbs;
  admin
  config
  local
  原始库就好别乱动


2.use databaseName;选库


3.show tables/collections;显示数据库表

  mongodb的表叫collections

4.如何创建库,可以用db.help()查看命令,查不到
  Mongodb的库是隐式创建的,你可以use一个不存在的库
  然后在该库下创建collection,即可创建库

5.db.createCollection("collectionName") 创建数据表
  例子
  use shop
  show collections
  db.createCollection('user');
  show dbs;

   其实collections允许隐式创建 db.collectionName.insert("")

  db.goods.insert({_id:1,name:'NOKIAN86',price:'29.9'});

  
6.插入和查询
  db.user.insert({name:'lisi',age:22}) //主键自动生成
  db.user.find();
  db.user.insert({_id:2,name:'poly',age:22}) // 自定义主键
  db.user.insert({_id:3,name:'hmm',bobby:['basketball','football'],intro:{'title':'My intro',content:'from china'}});
  db.stu.insert([{_id:3,sn:"003",name:"lis"},{_id:4,sn:"004",name:"zhaowu"}]) //插入多条,id可以指定部分

 

7.db.user.drop(); 删除collection

8.db.dropDatabase(); 删除数据库,谨慎使用


 

详细的curd
1.删除
db.stu.remove({sn:'001'});
db.stu.remove();//清空
db.stu.insert([{name:'songjiang',gender:'m'},{name:'dalang',gender:'m'},{name:'poxi',gender:'f'},{name:'jinlin',gender:'f'}])
db.stu.remove({gender:'f'}) //删除所有匹配行
db.stu.remove({gender:'f'},true) // 删除一行


2.改 update操作
改谁?查询表达式
改成怎么样?--新值或赋值表达式
操作选项--可选参数

修改整个文档
db.stu.update({name:'dalang'},{'name':'wudalang'})
如果是想修改文档的某列,可以用$set关键字
db.collectionName.update(query,{$set:{name:'QQ'}})
$set 修改某个列的值
$unset删除某个列
$rename 重命名某个列
$inc 增长某个列的值
例子
db.stu.insert({
name:'wukong',
jinggu:true,
gender:'f',
age:500
})
db.stu.update({name:'wukong'},{$set:{name:'dzsf'}},{$unset:{jinggu:1}},{$rename:{gender:'sex'}},{$inc:{age:1}})

第三个参数
(upsert:true/false,multi:true/false)
Upsert--是指有没有匹配行,则直接插入该行(和mysql中的replace一样)
db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true})

$setOnInsert当upsert为true时,并且发生了insert操作时,可以补充的字段 2.4版本有的命令
db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'},$setOnInsert:{gender:'男'}},{upsert:true})

multi--改多行,用这个选项

db.news.update({age:21},{$set:{age:22}},{multi:true})
则把news中所有age=21的文档都修改

 

11.查 findOne find
db.stu.find() 查询所有文档
db.stu.find({},{gender:1,_id:0}) // id默认是查询出来的,查询所有文档的gender属性,并且不查询_id熟悉
db.stu.find({gender:'m'},{name:1,_id:0}) // 查询所有gender属性值为m的文档中的name属性


 

 深入查询表达式

$ne --- != 不等于
{filed:($nq:value)}
例子
db.stu.find({_id:{$ne:3}},{name:1,sn:1}) 查询出id不等于3的文档的name和sn的列

$gt > 大于
db.stu.find({age:{$gt:500}},{name:1,_id:1}) 查询年龄大于500的所有文档的name和id列
$gte >= 大于等于
$in
db.stu.find({_id:{$in:[2,3]}}) 查找出id=2,3的列
$nin
db.stu.find({_id:{$nin:[2,3]}})
$lt <
$lte <=
$nin --not in
$all 指所有单元匹配
db.stu.find({hobby:{$all:['足球','篮球','冰球']}},{_id:1}) //查询出所有的hobby里有三个爱好为足球,篮球,冰球的并且只返回_id列

$or --or
db.stu.find({$or:[{age:{$gte:500}},{age:{$lte:512}}]})
满足一个即可
$and --and
查询age>=500 and age<=532
db.stu.find({$and:[{age:{$gte:500}},{age:{$lte:532}}]}) //lte可以换成其他表达式
$not --not 自己试一下
$nor 无对应项,指所有列举条件都不应成功则为真
db.stu.find({$nor:[{age:{$gte:500}},{age:{$lte:512}}]})

$exists 某列存在则为真
db.stu.find({age:{$exists:1}}); // 含有age属性的列查询出来

$mod 满足求余条件则为真
db.stu.find({_id:{$mod:[2,0]}}) // 查询id mod2 =0的列

$type 数据为某些类型则为真

$where
db.stu.find({$where:'this.age>500'},{name:1,age:1})
db.stu.find({$where:'this.age>500 && this.age < 510'},{name:1,age:1}) //还可以用&&

$regex
/^诺基亚.*/ 没有起效

 


 

游标操作

游标的操作
游标,不是查询结果,而是查询的返回资源,或者接口
通过接口,你可以逐条读取
就像php中的fopen打开文件,得到一个资源一样,通过资源,可以一行一行的读取


var mycursor = db.bar.find();
mycursor.next();
print(mycursor.next());


//插入

for(var i =0; i < 100 ; i++){
db.bar.insert({_id:i+1,title:'hello world',content:'aaa'+i})
}
//循环游标
var mycursor = db.bar.find();
mycursor.next();
for(var doc = true;mycursor.hasNext();){
printjson(mycursor.next());
}


var mycursor = db.bar.find();
while(mycursor.hasNext()){
printjson(mycursor.next());
}

var mycursor = db.bar.find();
mycursor.forEach(function(obj){printjson(obj)})


db.bar.find().count();

db.bar.find();

游标在分页中的使用,
比如查到1000行,跳过100页,取10行
一般地,我们假设每页N行,当前是page页
就需要跳过前(page-1)*N行,再取N行,在mysql中,limit offset,N来实现
在mongo中,使用skip,limit函数
var cursor = db.bar.find().skip(95);
cursor.forEach(function(obj){printjson(obj)})


每页2条
var cursor = db.bar.find().skip(95).limit(2);
cursor.forEach(function(obj){printjson(obj)})

通过cursor一次性得到所有数据,并返回数组,数据少的时候可以这样,因为会把数据以对象形式组织在内存里面
var cursor = db.bar.find().limit(10);
cursor.toArray()

//看到第二行
var cursor = db.bar.find().limit(10);
cursor.toArray()[2]


索引 

索引创建
1.索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引
2.在mongodb中索引可以按字段升序/降序来创建,便于排序
3.默认是用btree来组织索引文件,2.4版本以后,允许建立hash索引

常用命令
查看当前索引状态:db.collection.getIndexs();

创建普通的单列索引:db.collection.ensureIndex(field:1/-1);
创建多列索引 db.collection.ensureIndex({field:1/-1,field2:1/-1})
创建子文档索引
db.collection.ensureIndex({filed.subfield:1/-1});
创建唯一索引
db.collection.ensureIndex({})

//分析执行计划
db.stu.find({sn:002}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "shop.stu",
"indexFilterSet" : false,
"parsedQuery" : {
"sn" : {
"$eq" : 2
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"sn" : {
"$eq" : 2
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "80276649-OAPC",
"port" : 27017,
"version" : "3.6.12",
"gitVersion" : "c2b9acad0248ca06b14ef1640734b5d0595b55f1"
},
"ok" : 1
}


--建立单列索引 1是升序,2是降序
db.stu.ensureIndex({sn:1})

{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "shop.stu",
"indexFilterSet" : false,
"parsedQuery" : {
"sn" : {
"$eq" : 2
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"sn" : {
"$eq" : 2
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "80276649-OAPC",
"port" : 27017,
"version" : "3.6.12",
"gitVersion" : "c2b9acad0248ca06b14ef1640734b5d0595b55f1"
},
"ok" : 1
}

{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "shop.stu",
"indexFilterSet" : false,
"parsedQuery" : {
"sn" : {
"$eq" : 2
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"sn" : 1
},
"indexName" : "sn_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"sn" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"sn" : [
"[2.0, 2.0]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "80276649-OAPC",
"port" : 27017,
"version" : "3.6.12",
"gitVersion" : "c2b9acad0248ca06b14ef1640734b5d0595b55f1"
},
"ok" : 1
}

-- 查看索引
db.stu.getIndexs()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "shop.stu"
},
{
"v" : 2,
"key" : {
"sn" : 1
},
"name" : "sn_1",
"ns" : "shop.stu"
}
]

--删除索引
db.stu.dropIndex({sn:1})


--添加多列索引
db.stu.ensureIndex({sn:1,name:1})
db.stu.getIndexes()

--添加子文档索引
db.shop.insert({name:'Nokia',spc:{weight:120,area:'taiwan'}})
db.shop.insert({name:'sanxing',spc:{weight:100,area:'hangguo'}})
db.shop.find({'spc.area':'taiwan'})

db.shop.ensureIndex({'spc.area':1})

 

转载于:https://www.cnblogs.com/chenminghe3496/p/10914371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值