MongoDB相关命令

导读:本篇文章讲解 MongoDB相关命令,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

需求概述

需求:存放文章评论的数据存放到MongoDB中,数据结构参考如下:
数据库:articledb

专栏文章评论 Comment
字段名称 字段含义 字段类型 备注
_id ID ObjectId或者String mongo的主键的字段
articleid 文章id String
content 评论内容 String
userid 评论人ID String
nickname 评论人昵称 String
createdatetime 评论的日期时间 Date
likenum 点赞数 Int32
replynum 回复数 Int32
state 状态 String 0:不可见;1:可见
parentId 上级ID String 如果为0表示文章的顶级评论

数据库操作

数据库登陆

# 切换到mongo部署目录下
# 无密码登录:
mongo --host=127.0.0.1 --port=27017 
# 用户名密码,指定数据库登录
# --authenticationDatabase 后面跟知道的mongo集合
./mongo --host=xxx.xxx.xxx.xxx --port=27017 -u "userName" -p "password" --authenticationDatabase "mongoCollectionName"

选择和创建数据库

选择和创建数据库的语法格式

use  数据库名称

如果数据库不存在则自动创建,例如,以下语句创建articledb数据库:

use   articledb

可以使用db命令查看当前使用的数据库

> use test1db
switched to db test1db
> db
test1db

对于之前不存在的数据库,使用use创建之后,使用show dbs查询不到新的数据库。
因为刚创建的数据库是存放在内存中,还没有写到磁盘上,直到有一个文档内容写入新的数据库,新的数据库才会写入磁盘,使用show dbs才能查看到。

保留库

  1. admin
    从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  2. local
    这个数据库永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
  3. config
    当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

数据库的删除

MongoDB删除数据库的语法格式如下:

db.dropDatabase()

提示:主要用来删除已经持久化的数据库。

索引创建

创建索引是在集合上面创建,格式如下:

db.<collection>.createIndex(<keyPatterns>,<options>)
<collection>:集合名。
<keyPatterns>:包含用于建立索引的字段和索引类型。
常见的索引类型如下:
1:创建升序索引
-1:创建降序索引
"hashed":创建哈希索引

普通索引创建

db.collectionName.createIndex(
{
  "fieldXXX" : 1
},
{
  "name" : "fieldXXX_1"
});

唯一索引创建

db.collectionName.createIndex(
{
  "fieldXXX" : 1
},
{
  "name" : "fieldXXX_1",
  "unique" : true
})

hash索引创建

db.collectionName.createIndex(
{
  "_id" : "hashed"
},
{
  "name" : "_id_hashed"
})

集合操作

集合,类似关系型数据库中的表。
可以显示的创建,也可以隐式的创建。

集合的显示创建(了解)

基本语法格式:

db.createCollection(name)

参数说明:

  • name:要创建的集合名称。
    例如:创建一个名为mycollection的普通集合。
    db.createCollection(“mycollection”)
    查看当前库中的表:show tables命令。
show collections
或
show tables

集合的命名规范:

  1. 集合名不能是空字符串“”。
  2. 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  3. 集合名不能以“system.”开头,这是为系统集合保留的前缀。
  4. 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

集合的隐式创建

当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。
文档的插入部分,会详细讲解。
提示:通常我们都是隐式创建集合。

集合的删除

集合删除的语法格式:

db.collectionName.drop()

返回值
如果成功删除选定集合,则drop()方法返回true,否则返回false。
例如:删除mycollection集合

db.mycollection.drop()

文档的CRUD

文档(document)的数据结构和JSON基本一样。
所有存储在集合中的数据都是BSON格式。

文档的插入

单个文档插入

使用insert()或者save()方法想集合中插入文档,语法如下:
db.collection.insert(
,
{
writeConcern:,
ordered:
}
)
参数:

Paramter Type Description
document document or array 要插入到集合中的文档或文档数组(json格式)
writeConcern document 可选的。
ordered boolean 可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回而不是出了数组中的其余文档,如果为假,则只需无序插入,如果其中一个文档出现错误,则继续处理数组中的其余文档。在版本2.6中默认为true。
  • 示例,向comment集合中插入一条测试数据:
> db.comment.insert({"articleid":"100000","content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":null})
WriteResult({ "nInserted" : 1 })

提示:

  1. comment集合如果不存在,则会隐式创建。
  2. mongo中的数字,默认情况下是double类型,如果要存储整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
  3. 插入当前日志使用new Date()。
  4. 插入的数据没有指定_id,会自动生成主键值。
  5. 如果某字段没值,可以赋值为null,或不写该字段。
    执行后,如下,说明插入一个数据成功了。
WriteResult({ "nInserted" : 1 })

注意:

  1. 文档中键/值对是有序的。
  2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
  3. MongoDB区分类型和大小写。
  4. MongoDB的文档不能有重复的键。
  5. 文档的键就是字符串。除了少数例外情况,键可以是任意UTF-8字符。

批量插入

语法:

db.collection.insertMany(
[<document 1>,<document 2>, ...],
{
	writeConcern:<document>,
	ordered:<boolean>
}
)

参数:

Paramter Type Description
document document or array 要插入到集合中的文档或文档数组(json格式)
writeConcern document 可选的。
ordered boolean 可选。如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回而不是出了数组中的其余文档,如果为假,则只需无序插入,如果其中一个文档出现错误,则继续处理数组中的其余文档。在版本2.6中默认为true。
  • 示例
> db.comment.insertMany([
... {"articleid":"100000","content":"今天天气真好,阳光明媚","userid":"1001","nickname":"Rose","createdatetime":new Date(),"likenum":NumberInt(10),"state":1},
... {"articleid":"100001","content":"调皮的小孩,喜欢玩","userid":"1002","nickname":"Jack","createdatetime":new Date(),"likenum":NumberInt(20),"state":1},
... {"articleid":"100002","content":"喜欢魅力的中国","userid":"1003","nickname":"Emmit","createdatetime":new Date(),"likenum":NumberInt(30),"state":1}
... ]
... )
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("606b17dccd9ad1a1f5423818"),
                ObjectId("606b17dccd9ad1a1f5423819"),
                ObjectId("606b17dccd9ad1a1f542381a")
        ]
}
> db.comment.find()
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2021-04-05T13:27:08.666Z"), "likenum" : 10, "state" : null }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423818"), "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 10, "state" : 1 }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423819"), "articleid" : "100001", "content" : "调皮的小孩,喜欢玩", "userid" : "1002", "nickname" : "Jack", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 20, "state" : 1 }
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 30, "state" : 1 }
>

提示
插入时指定_id,则主键就是该值。
如果某条数据插入失败,将会终止插入,但是已经插入成功的数据不会回滚掉。
因为批量插入,由于数据多容易出现失败,因此,可以使用try catch进行异常捕获处理,测试的时候可以不处理

文档的查询

条件查询

查询数据的语法格式如下

db.collection.find(<query>,[projection])

参数:

Parameter Type Description
query document 可选。使用查询运算符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或者传递空文档({})。
projection doucment 可选。指定要在于查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有自动,请省略此参数。
  • 示例
  1. 查询所有
    如果我们要查询comment集合中的所有文档,我们输入以下命令:
db.comment.find()
或
db.comment.find({})

> db
articledb
> db.comment.find()
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2021-04-05T13:27:08.666Z"), "likenum" : 10, "state" : null }
> db.comment.find({})
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "articleid" : "100000", "content" : "今天天气真好,阳光明媚", "userid" : "1001", "nickname" : "Rose", "createdatetime" : ISODate("2021-04-05T13:27:08.666Z"), "likenum" : 10, "state" : null }
  • 这里可以发现每条文档会有一个叫_id的字段,这个相当于我们原来关系型数据库中表的主键,当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。
  • 如果我们在插入文档记录时指定该字段也可以,棋类可以是ObjectId类型,也可以是MongoDB支持的任意类型。
  • 如果我们想按一定条件来查询,比如我想查询userid为1002的文档记录,只要在find()中添加参数即可,参数也是json格式,如下:
> db.comment.find({userid:"1002"})
{ "_id" : ObjectId("606b17dccd9ad1a1f5423819"), "articleid" : "100001", "content" : "调皮的小孩,喜欢玩", "userid" : "1002", "nickname" : "Jack", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 20, "state" : 1 }
  • 如果你需要返回符号条件的第一条数据,我们可以使用findOne命令来实现,语法和find一样。
    如:查询用户编号是1002的记录,但只最大返回符号条件的第一条记录:
db.comment.findOne({userid:"1002"})

> db.comment.findOne({"userid":"1002"})
{
        "_id" : ObjectId("606b17dccd9ad1a1f5423819"),
        "articleid" : "100001",
        "content" : "调皮的小孩,喜欢玩",
        "userid" : "1002",
        "nickname" : "Jack",
        "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"),
        "likenum" : 20,
        "state" : 1
}
>

投影查询(projection query)

类似于msyql的select 后面跟着的列名称,就是指定需要显示的文档字段。
如果要查询结果返回部分字段,则需要使用投影查询(不显示所有字段,只显示指定的字段)。

  • 如:查询结果值显示_id,userid,nickname
> db.comment.find({articleid:"100000"},{"userid":1,"nickname":1})
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "userid" : "1001", "nickname" : "Rose" }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423818"), "userid" : "1001", "nickname" : "Rose" }
> db.comment.find({articleid:"100000"},{"userid":1,nickname:1})
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "userid" : "1001", "nickname" : "Rose" }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423818"), "userid" : "1001", "nickname" : "Rose" }
> db.comment.find({articleid:"100000"},{userid:1,nickname:1})
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "userid" : "1001", "nickname" : "Rose" }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423818"), "userid" : "1001", "nickname" : "Rose" }
> db.comment.find({articleid:"100000"},{userid:1,nickname:1,_id:0})
{ "userid" : "1001", "nickname" : "Rose" }
{ "userid" : "1001", "nickname" : "Rose" }
  • 默认会显示_id,如果不想显示_id,需要把_id后面设置为0。
> db.comment.find({articleid:"100000"},{userid:1,nickname:1,_id:0})
{ "userid" : "1001", "nickname" : "Rose" }
{ "userid" : "1001", "nickname" : "Rose" }
>
  • 查询全部数据,只显示_id,userid,nickname
> db.comment.find({},{userid:1,nickname:1})
{ "_id" : ObjectId("606b102ccd9ad1a1f5423817"), "userid" : "1001", "nickname" : "Rose" }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423818"), "userid" : "1001", "nickname" : "Rose" }
{ "_id" : ObjectId("606b17dccd9ad1a1f5423819"), "userid" : "1002", "nickname" : "Jack" }
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "userid" : "1003", "nickname" : "Emmit" }
>

注意:

  1. projection 也是Json格式的,相当于指定需要显示的字段,和select后面写明列功能一致。
  2. 如果想显示某个字段,字段名:1,不想显示:字段名:0,像上面的操作一样。

文档的插入使用try catch

插入时指定了_id,则主键就是该值。
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。

  • 示例:
try {
... db.comment.insertMany([ {"_id":"1","articleid":"100001","content":"我们不应该把清晨浪费在手机上。","userid":"1002"}]);
... } catch(e) {
... print(e);
... }
BulkWriteError({
        "writeErrors" : [
                {
                        "index" : 0,
                        "code" : 11000,
                        "errmsg" : "E11000 duplicate key error collection: articledb.comment index: _id_ dup key: { _id: \"1\" }",
                        "op" : {
                                "_id" : "1",
                                "articleid" : "100001",
                                "content" : "我们不应该把清晨浪费在手机上。",
                                "userid" : "1002"
                        }
                }
        ],
        "writeConcernErrors" : [ ],
        "nInserted" : 0,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

文档的更新

更新文档的语法:

db.collection.update(query, update, options)
// 或者
db.collection.update(
<query>,
<update>,
{
	upsert:<boolean>,
	multi:<boolean>,
	writeConcern:<document>,
	collation:<document>,
	arrayFilters:[<filterdocument1>, ... ],
	hint:<document|string>
}
)

参数:

Parameter Type Description
query document 更新的选择条件。可以使用与find()方法中相同的查询选择器,类似sql中的update查询内where后面的。在3.0版中进行更改;当使用upsert:true执行update()时,如果查询使用点表示法在_id字段上指定条件,则MongoDB将拒绝插入新的文档。
update doucment or pipeline 要应用的修改。该值可以是:包含更新运算符表达式的文档,或仅包含:对的替换文档,或在MongoDB 4.2中启动聚合管道。管道可以由以下阶段组成:

a

d

d

F

i

e

l

d

s

及其别名

addFields及其别名

addFields及其别名set

p

r

o

j

e

c

t

及其别名

project及其别名

project及其别名unset

r

e

p

l

a

c

e

r

o

o

t

及其别名

replaceroot及其别名

replaceroot及其别名replaceWith。换句话说:它是update的对象和一些更新的操作符(如

inc…)等,也可以理解为sql update查询内set后面的值。

upsertboolean可选。如果设置为true,则在没有与查询条件匹配的文档时创建新文档。默认值为false,如果找不到匹配项,则不会插入新文档。
multiboolean可选。如果设置为true,则更新符号查询条件的多个文档。如果设置为false,则更新一个文档,默认值为false。
writeConcerndocument可选。表示写问题的文档,抛出异常的级别。
collationdocument可选。
指定要用于操作的校对规则。
校对规则允许用哪个好为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。
校对规则选项具有以下语法:
校对规则:{
区域设置:,
caseLevel:,
caseFirst:,
强度:,
numericordering:,
替代:,
最大变量:,
向后:
}
指定校对规则时,区域设置字段时必需的;所有其他校对规则字段都是可选的。有关字段的说明,请参阅校对规则文档。
如果未指定校对规则,但集合具有默认校对规则(请参见db.createCollection()),则该操作将使用为集合指定的校对规则。
如果没有为集合或操作指定校对规则,MongoDB将使用以前版本中使用的简单二进制比较进行字符串比较。不能为一个操作指定多个校对规则。例如,不能为每个字段指定不同的校对规则,或者如果使用排序执行查找,则不能将一个校对规则用于查找,另一个校对规则用于排序。
3.4版新增。
arrayFiltersarray可选。一个筛选文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素。在更新文档中,使用

[

]

s

[

]

筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,

<

i

d

e

n

t

i

f

i

e

r

>

必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符(

[],s_[]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符(

[]s[]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符([标识符])都必须指定一个对应的数组筛选器文档。也就是说,不能为同一标识符指定多个数组筛选器文档。3.6版+

hintdocument or string可选。指定用于支持查询谓词的索引的文档或字符串。该选项可以采用索引规范文档或索引名称字符串。如果指定的索引不存在,则说明操作错误。例如,请参阅版本4中的为更新操作指定提示。

提示:
主要关注前四个参数即可。

示例:

  1. 覆盖的修改
    如果我们想修改_id为1的记录,点赞量为1001,输入以下语句:
> db.comment.find({"_id":"1"});
{ "_id" : "1", "articleid" : "100001", "content" : "我们不应该把清晨浪费在手机上。", "userid" : "1002" }

> db.comment.update({_id:"1"},{likenum:NumberInt(1001)});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({"_id":"1"});
{ "_id" : "1", "likenum" : 1001 }
> db.comment.update({_id:"1"},{likenum:NumberInt(1002)});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({"_id":"1"});
{ "_id" : "1", "likenum" : 1002 }

执行后,我们会发现,这条文档处理likenum字段其他字段都不见了。
2. 局部修改
为了解决这个问题,我们需要使用修改器 $set 来实现,命令如下:
我们想修改 articleid 为 100002 的记录,浏览量为889,输入以下语句:

> db.comment.find({articleid:"100002"});
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 30, "state" : 1 }
>
> db.comment.update({articleid:"100002"},{$set:{likenum:NumberInt(889)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.comment.find({articleid:"100002"});
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 889, "state" : 1 }
  1. 批量的修改
    更新所有用户为1003的用户的昵称为凯撒大帝。
// 默认只修改第一条数据
db.comment.update({userid:"1003"}, {$set:{nickname:"凯撒"}})
// 修改所有符号条件的数据
db.comment.update({userid:"1003"}, {$set:{nickname:"凯撒大帝"}}, {multi:true})

提示:
如果不加后面的参数,则只更新符号条件的第一条记录。

  1. 列值增长的修改
    如果我们想实现某列值在原有值的基础上进行增加或减少,可以使用$inc 运算符来实现。
    需求:对3号数据的点赞数,递增1
db.comment.update({_id:"3"},{$inc:{likenum:NumberInt(1)}})

文档的删除

删除文档的语法结构:

db.集合名称.remove(条件)

以下语句可以将数据全部删除,请慎用

db.comment.remove({})

如果删除id=1的记录,输入以下语句

db.comment.remove({_id:"1"})

文档的分页查询

统计查询

统计查询使用count()方法,语法如下:

db.collection.count(query,options)

参数:

Parameter Type Description
query document 查询选择条件。
options document 可选。用于修改计算的额外选项。

提示:
可选项暂时不使用。

示例:

  1. 统计所有记录数:
    统计comment集合所有的记录数:
> db.comment.count()
5
  1. 按条件统计记录数
    例如:统计articleid为100000的记录条数
> db.comment.count({articleid:"100000"})
2

默认情况下count()方法返回符合条件的全部记录条数。

分页列表查询

可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据(比如跳过2条,skip(2))。
基本语法如下所示:

db.collection.find().limit(number).skip(number)

结果:

> db.comment.find().limit(2).skip(2)
{ "_id" : ObjectId("606b17dccd9ad1a1f5423819"), "articleid" : "100001", "content" : "调皮的小孩,喜欢玩", "userid" : "1002", "nickname" : "Jack", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 20, "state" : 1 }
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 889, "state" : 1 }

如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20,例如:

db.comment.find().limit(3)

skip方法同样接受一个数字参数作为跳过的记录条数。(前N条数据不要),默认值为0。

db.comment.find().skip(3)

分页查询:需求,每页2个,第二页开始,跳过前两条数据,接着值显示3和4条数据

// 第一页
db.comment.find().skip(0).limit(2)
// 第二页
db.comment.find().skip(2).limit(2)
// 第三页
db.comment.find().skip(4).limit(2)

排序查询

sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排序,而-1为降序排序。
语法如下所示:

db.collection.find().sort({key:1})
或者
db.collection.find().sort(排序方式)

例如:
对userId降序排列,并对访问量进行升序排序。

db.comment.find().sort({userid:-1,likenum:1})

提示:
skip(),limit(),sort()三个放在一起执行的时候,执行的顺序是先sort(),然后是skip(),最后是显示的limit(),和命令编辑顺序无关。

文档的其他类型的查询

正则的复杂条件查询

MogoDB的模糊查询是通过正则表达式的方式实现的,格式为:

db.collection.find({field:/正则表达式/})

提示:正则表达式是js的语法,直接量的写法。
例如,我要查询评论内容包含“开水”的所有文档,代码如下:

db.comment.find({content:/开水/})

如果要查询评论的内容以“专家”开头的,代码如下:

db.comment.find({content:/^专家/})

不是jpg或者png的记录

db.collectionName.find({"extName":/[^jpg|png]/}).limit(10);

比较查询

<,<=,>,>= 这些操作符也是很常用的,格式如下:

db.collection.find({"field":{$gt:value}})  // 大于:field > value
db.collection.find({"field":{$lt:value}})  // 小于:field < value
db.collection.find({"field":{$gte:value}}) // 大于等于:field >= value
db.collection.find({"field":{$lte:value}}) // 小于等于:field <= value
db.collection.find({"field":{$ne:value}})  // 不等于:field != value

示例:查询评论点赞数量大于700的记录

> db.comment.find({likenum:{$gt:NumberInt(700)}})
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 889, "state" : 1 }
{ "_id" : "1", "likenum" : 1002 }

包含查询

包含使用$in操作符。
示例:查询评论的集合中userid自动包含1003或1004的文档

> db.comment.find({userid:{$in:["1003","1004"]}})
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 889, "state" : 1 }

不包含使用$nin操作符。
示例:查询评论集合中userid字段不包含1003和1004的文档

db.comment.find({userid:{$nin:["1003","1004"]}})

条件连接查询

  • 我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and)
    格式为:
$and:[{},{},{}]

示例:查询评论集合中likenum大于等于700并且小于1000的文档:

> db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(1000)}}]})
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 889, "state" : 1 }
  • 如果两个以上条件之间是或者的关系,我们使用$or操作符进行连接,与前面的and的使用方式相同,格式为:
$or:[{},{},{}]

示例:查询评论集合中userid为1003,或者点赞数小于1000的文档记录

> db.comment.find({$or:[{userid:"1003"},{likenum:{$gt:NumberInt(1000)}}]})
{ "_id" : ObjectId("606b17dccd9ad1a1f542381a"), "articleid" : "100002", "content" : "喜欢魅力的中国", "userid" : "1003", "nickname" : "Emmit", "createdatetime" : ISODate("2021-04-05T13:59:56.423Z"), "likenum" : 889, "state" : 1 }
{ "_id" : "1", "likenum" : 1002 }

字段为空的查询

fileName在集合中不存在。

db.collectionName.find({$and:[{'fileType':"0"},{fileName:null}]}).limit(100);

不等于查询

db.collectionName.find({"deleted":{$ne:"1"}});

复杂查询

Mongon中的DateTime类型的时间查询

特定时间查询

var start = new Date(“2021-07-02”);
db.fileRecord_202107.find({“addTime”:{“$gte”:ISODate(‘2021-07-06T02:00:00Z’)}}).limit(10);

时间段查询

7.6 10点到11点,查询语句中需要减8,其他的时间类似,减一下8就可以了
db.collectionName.find({‘addTime’:{

g

t

e

:

I

S

O

D

a

t

e

(

2021

07

06

T

02

:

00

:

00

Z

)

,

gte:ISODate(‘2021-07-06T02:00:00Z’),

gte:ISODate(20210706T02:00:00Z),lte:ISODate( ‘2021-07-06T03:00:00Z’)}})

脚本

脚本使用JS语法,直接在mongos客户端执行,或者mongoDB各种客户端执行。

循环插入、删除记录

for (var i = 0; i < 15; i++) {
    var uid  = i;
    var name = "testSharding" + i + ".jpg";
    db.collectionTest.insert({
    "name" : name,
    "url" : "aaatest.jpg",
    "type" : "0",
    "asyn" : "0",
    "addTime" : Date()
});
 sleep(100);
};

for (var i = 0; i < 15; i++) {
    var uid  = i;
    var name = "testSharding" + i + ".jpg";
    db.collectionTest.remove({
    "name" : name
});
sleep(100);
};

 db.collectionTest.find({})

参考

MongoDB逻辑操作符$or,

a

n

d

,

and,

and,not,$nor

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100358.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!