mongodb入门-1-基本概念及命令
什么是MongoDB
MongoDB是专为可扩展性,高性能和高可用性而设计的NoSQL数据库。它可以从单服务器部署扩展到大型、复杂的多数据中心架构。
利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。 MongoDB的本地复制和自动故障转移功能使您的应用程序具有企
业级的可靠性和操作灵活性。
官方网址:https://www.mongodb.com/
中文文档地址:https://docs.mongoing.com/
菜鸟教程:https://www.runoob.com/mongodb/mongodb-tutorial.html
简单的说,MongoDB是一种文档型数据库,记录数据的格式类似于JSON,但比JSON更加的强大。
安装
大致安装步骤,下载tar文件,解压+配置PATH+启动
解压至/usr/local/mongodb目录之后,我们可以把 MongoDB 的二进制命令文件目录(安装目录/bin)添加到 PATH 路径中:
export PATH=/usr/local/mongodb/bin:$PATH
创建日志及数据存放的目录:
数据存放路径:
sudo mkdir -p /usr/local/var/mongodb
日志文件路径:
sudo mkdir -p /usr/local/var/log/mongodb
接下来要确保当前用户对以上两个目录有读写的权限:
这一步至关重要:
sudo chown admin /usr/local/var/mongodb sudo chown admin /usr/local/var/log/mongodb
接下来我们使用以下命令在后台启动 mongodb:
mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork
--dbpath 设置数据存放目录
--logpath 设置日志存放目录
--fork 在后台运行
如果不想在后端运行,而是在控制台上查看运行过程可以直接设置配置文件启动:
mongod --config /usr/local/etc/mongod.conf
查看 mongod 服务是否启动:
ps aux | grep -v grep | grep mongod
使用以上命令如果看到有 mongod 的记录表示运行成功。
mongod 命令后台进程方式:
mongod --config /usr/local/etc/mongod.conf --fork
这种方式启动要关闭可以进入 mongo shell 控制台来实现:
> db.adminCommand({ "shutdown" : 1 })
以上步骤来源于:
https://www.runoob.com/mongodb/mongodb-osx-install.html
若只想熟悉命令,也可直接访问shell:https://www.mongodb.com/docs/v4.2/tutorial/getting-started/#mongo-web-shell 进行学习
基本概念

基本命令
//数据库的创建与删除
数据库没有显示的创建,随着数据的灌入而创建
show dbs
use [database]
db.[dbname].insert({"a":"b"})
db.[dbname].dropDatabase()
创建集合
db.[db].createCollection("myCollection")

db.createCollection("collectionName",{options})

options如下:

删除集合
db.[myCollection].drop()

插入文档
MongoDB中的文档和JSON基本一样,所有数据都是BSON格式,BSON即Binary JSON简称。
db.COLLECTION_NAME.insertOne(document)
db.COLLECTION_NAME.insertMany([d1,d2])
db.COLLECTION_NAME.insert(document)
查询:
db.COLLECTION_NAME.find()
更新文档
MDB使用update和save更新文档

update()
语法:
db.COLLECTION_NAME.update({"targetField":"targetVal"},{$set:{"updated":"updatedVal"}})
记住一条,所有的表达式需要符合BSON标准
在我操作过程中报如下错误:

这是因为我之前的集合被设置成了固定集合,固定集合的数据不能修改,只能查找-删除-再插入。


以上语句只会更新第一条数据,如果需要更新多个,则需要将multi设置为true

save()

通过save保存的document,会自动更新同ObjectID的文档。

如果需要更新年龄大于18的,使用如下命令。

删除文档
删除使用的是remove函数,语法如下:

示例:


如果想删除当下所有的数据,使用如下命令
db.COLLECTION_NAME.remove({}),类似于MYSQL的truncate

查询文档



AND
多个条件,使用逗号分割,如下:

如图所示,查询结果不符合预期,以下写法才正确:

及AND条件,若出现了同样的KEY,后面的会覆盖之前的。
OR
OR的条件,通过$or指定(注意只能小写),后面是一个数组,如下:
若要查询age=21或者20的数据,则:

OR和AND的联用:
若要查询name=mike,age为21或22的,语句如下:

截止目前,我们调整的都是query的参数,find还有一个参数projection,调整的是查询到数据之后的返回策略。
db.collection.find(query, projection)
若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键
除了_id字段,其余的字段都需要有统一的返回策略,
- 如title指定1,即只指定title返回,其余需要返回的字段需要单独指定1,否则默认不返回。
- 若title指定0,则只有title隐藏,其余需要隐藏的字段也需要指定0,否则默认都返回
- 针对
_id字段,其1就是返回,0就是隐藏,若不指定,默认都返回。
普通字段不能同时有0和1,否则会报错如下:

条件操作符
上文中,或多或少我们已经接触了$xx的使用。MDB中常用的条件操作符如下:
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
- (!= ) 不等于 - $ne
- (== ) 等于 - $eq
模糊匹配


type操作符
按照type去取值,基本用法即$type, type对应的表如下:


Limit与Skip的用法
limit类似与MYSQL中的功能,指定数量的返回

skip则类似于MYSQL中的offset,跳过指定数量

类似于MYSQL中LIMIT OFFSET在大数量级的效率问题 MDB中也会有同样的问题,实际使用中,建议通过where先定位记录,再使用limit,而不要使用skip。
最后,通过一个例子来加深一下limit和skip的使用:
> var arr = [];
>
> for(var i=1 ; i<=20000 ; i++){
... arr.push({num:i});
... }
20000
>
> db.numbers.insert(arr);
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 20000,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.numbers.find({$and:[{"num":{$lt:60}},{"num":{$gt:45}}]}).limit(7).skip(5);
{ "_id" : ObjectId("623edd97777c8dcc447b4953"), "num" : 51 }
{ "_id" : ObjectId("623edd97777c8dcc447b4954"), "num" : 52 }
{ "_id" : ObjectId("623edd97777c8dcc447b4955"), "num" : 53 }
{ "_id" : ObjectId("623edd97777c8dcc447b4956"), "num" : 54 }
{ "_id" : ObjectId("623edd97777c8dcc447b4957"), "num" : 55 }
{ "_id" : ObjectId("623edd97777c8dcc447b4958"), "num" : 56 }
{ "_id" : ObjectId("623edd97777c8dcc447b4959"), "num" : 57 }
>
浙公网安备 33010602011771号