MongoDB基础

本文档详细介绍了MongoDB的安装步骤,包括下载、解压、配置环境变量及启动服务。MongoDB是一种非关系型数据库,支持海量数据存储,其数据模型类似于JSON对象。文中还展示了如何创建、查询和更新数据,以及使用各种逻辑操作符进行复杂查询。此外,还讨论了MongoDB的_id字段和写操作的确认方式。

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

概念
非关系型数据库(无sql语句),用于存储海量的数据。在非关系型数据库中排名第一。
MDB记录一个文档(mysql中的表概念),是由字段和值对组成的数据结构,类似JSON对象,字段的值可以包括其他文档。其数据模型在内存中的表现形式和对象一样。
同一个集合的字段可能不同,线上修改数据模型,修改时应用与数据库都无须下线。
安装
1、下载并解压MongoDB
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.2.tgz
tar -xvzf mongodb-linux-x86_64-rhel70-4.4.2.tgz
2、添加到系统执行路径下面( ~/.bashrc)
export PATH=$PATH:<你机器MongoDB bin目录,如:/export/insert/mongodb-linux-x86_64-rhel70-4.4.2/bin>
执行 source ~/.bashrc
3、mkdir -p /data/db # 这个路径是MongoDB默认的数据存放路径
4、启动MongoDB服务
启动:mongod (该启动是前台启动,如果关闭窗口就消失了)
后台启动:mongod --fork --logpath /data/db/logpath/output.out
(output.out是需要我们自己去创建的文件)
使用
MDB基于安全考虑,默认安装后只会绑定本地ip127.0.0.1,我们需要修改成
mongod --bind_ip 192.168.88.3。内网访问很安全
启动
mongo --host --port
我们直接在本机启动使用mongo即可
1、设置用户名密码
use admin # 设置密码需要切换到admin库
db.createUser({user:“yd”,pwd:“yd123”,roles:[“root”]})
show users # 查看所有用户信息

停掉服务
db.shutdownServer()
exit退出mongosho

mongod --auth 授权的方式启动

mongo -u yd 进入数据库

查看有多少数据库show databases
创建数据库
use demo
添加数据
db.集合.insertOne 添加单个文档
db.集合.insertMany 添加多个文档
db.集合.insert 添加单个文档
(insert支持 explain命令,而其他两个不支持)
这里的集合我们理解成mysql的表即可。
在这里插入图片描述
查看当前的集合(表)命令
show tables (show collections)

在这里插入图片描述
db.lyd.find();查看当前集合(表)的数据;
在这里插入图片描述
获得数据中多了一个字段_id;
在MDB中的主键就是_id,这个是强制性的没办法改变。这就是唯一值且有一定的顺序(我们的索引就是根据这个来创建的)
我们MDB环境里面的语法就是js的语法,在这里使用js就可以操作所有东西了。
在这里我们的_id的值ObjectId(“602fba0adc0c6a3e942209af”)按照一定顺序排列,其前面四个字节是时间戳,后面则是可以理解成UUID。
直接执行ObjectId(“602fba0adc0c6a3e942209af”).getTimestamp()可以得到时间,这个时间不带时区,加上我们的时区则是当前的时间。
在这里插入图片描述
我们按照前面的时间戳就可以进行一定的排序,因为这个id是客户端生成的也没办法保证绝对的有序。
我们可以指定_id是多少比如
在这里插入图片描述
这里我们指定_id为100(_id不重复,其他字段随便重复也没关系)
writeConcern:在mdb的集合中,我们可以同这个参数的设置,决定一个写操作落到多少个节点上才算成功。
0:发起写操作,不关系是否成功
2:写操作呗复制到指定节点书才算成功,比如我们指定为2,那么主节点写成功了,还需要一个从节点写成功,才能算成功;
majority:过半成功即算成功;
ordered
当批量插入数据的时候,如果加了这个字段并且值为
true:在写的过程中有一条失败了,后面就不会再写了
false:写失败了,后面也会继续写;
例子:
db.lyd.insertMany(
[ {“name”:“yy”} , {“name”,“uu”}],
{
writeConcern: 0,
ordered: true
}
)
条件查询
在演示前创建大量数据到数据库中
类似这种数据,表名为lyy;
name: “qf”, age: 25, type: “A”, size: { h: 14, w: 21, c: 20 }, tags: [ “A”, “B” ]
精准等值查询
db.lyy.find( { type: “D” } );
status为D的所有查询出来
多条件查询
db.lyy.find( { age: 0, type: “D” } );
qty为0,status为D的全部查出来
嵌套对象精准查询
db.lyy.find( { “size.h”: “14” } );
返回指定字段
db.lyy.find( { }, { name: 1, type: 1 } );
{ “_id” : ObjectId(“602fc0abdc0c6a3e942209b0”), “name” : “qf”, “type” : “A” }
在这里1为显示,0为不显示,_id默认为显示。但是我们可以通过设置_id:0来使得id不显示。需要注意的是name为1,type不能为0,只能id为0,只能id与其他字段不通,其他字段必须是一样的。否则就会直接报错。
条件查询and
(这里使用中文的美元符号,不然笔记会出问题)
db.lyy.find({$and:[{“age”:0},{“type”:“A”}]}).pretty();
只有当age为0,type为A的时候才成立。
条件查询 or
db.lyy.find({$or:[{“age”:0},{“type”:“A”}]}).pretty();
当age为0或者type为A任意一个成立的时候即可;
MDB和sql查询对照表
在这里插入图片描述
复合主键
使用文档作为复合主键
db.xsn.insertOne({"_id":{“type”: 1, “state”: 2},“name”:“xsn”,age:18});
注意:如果主键的值改成"state": 2, “type”: 1,那么mdb会认为这是一个全新的主键,并不与之前的主键重复。顺序调换以后就是个全新的主键了。
逻辑操作符匹配
$not : 匹配筛选条件不成立的文档
$and : 匹配多个筛选条件同时满足的文档
$or : 匹配至少一个筛选条件成立的文档
$nor : 匹配多个筛选条件全部不满足的文档
构造一组数据:
db.bm.insertMany([
{
name:“A”,
jifen:100
},
{
name:“B”,
jifen:50
}
]);
$not
积分不小于100
db.bm.find({jifen: { $not: { $lt: 100}}} );
注意:$not 也会筛选出并不包含查询字段的文档
$and
db.bm.find({$and : [ {name:{ $eq : “A”}}, {jifen:{ $gt:1000}}]});
name为A积分大于1000的文档;
db.bm.find({[ {name:{ $eq : “A”}}, {jifen:{ $gt:1000}}]});
and是可以省略的,以上写法也是可以的;
db.bm.find({jifen:{ $gte:1000, $lte:2000}});
如果用于同一个字段也可以这样省略,大于等于1000,小于等于2000
$or
db.bm.find(
{$or : [
{name:{ $eq : “A”}},
{jifen:{ $gt:1000}}]}
);
如果等值查询那么$or和$in的结果是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值