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 进行学习

基本概念

image

基本命令

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

创建集合

db.[db].createCollection("myCollection")
image

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

options如下:
image

删除集合

db.[myCollection].drop()
image

插入文档

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更新文档
image

update()

语法:
db.COLLECTION_NAME.update({"targetField":"targetVal"},{$set:{"updated":"updatedVal"}})
记住一条,所有的表达式需要符合BSON标准

在我操作过程中报如下错误:

image

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

image

image

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

image

save()

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

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

image

删除文档

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

示例:

image

image

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

查询文档

image

image

image

AND

多个条件,使用逗号分割,如下:
image
如图所示,查询结果不符合预期,以下写法才正确:
image

及AND条件,若出现了同样的KEY,后面的会覆盖之前的。

OR

OR的条件,通过$or指定(注意只能小写),后面是一个数组,如下:
若要查询age=21或者20的数据,则:
image

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

截止目前,我们调整的都是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,否则会报错如下:
    image

条件操作符

上文中,或多或少我们已经接触了$xx的使用。MDB中常用的条件操作符如下:

  • (>) 大于 - $gt
  • (<) 小于 - $lt
  • (>=) 大于等于 - $gte
  • (<= ) 小于等于 - $lte
  • (!= ) 不等于 - $ne
  • (== ) 等于 - $eq

模糊匹配

image

image

type操作符

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

image

Limit与Skip的用法

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

image

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

image

类似于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 }
>
posted @ 2022-03-26 17:35  simplec  阅读(155)  评论(0)    收藏  举报