需求概述

需求:存放文章评论的数据存放到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中启动聚合管道。管道可以由以下阶段组成:addFields及其别名addFields及其别名addFields及其别名setproject及其别名project及其别名project及其别名unsetreplaceroot及其别名replaceroot及其别名replaceroot及其别名replaceWith。换句话说:它是update的对象和一些更新的操作符(如,,,inc…)等,也可以理解为sql update查询内set后面的值。
upsert boolean 可选。如果设置为true,则在没有与查询条件匹配的文档时创建新文档。默认值为false,如果找不到匹配项,则不会插入新文档。
multi boolean 可选。如果设置为true,则更新符号查询条件的多个文档。如果设置为false,则更新一个文档,默认值为false。
writeConcern document 可选。表示写问题的文档,抛出异常的级别。
collation document 可选。
指定要用于操作的校对规则。
校对规则允许用哪个好为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。
校对规则选项具有以下语法:
校对规则:{
区域设置:,
caseLevel:,
caseFirst:,
强度:,
numericordering:,
替代:,
最大变量:,
向后:
}
指定校对规则时,区域设置字段时必需的;所有其他校对规则字段都是可选的。有关字段的说明,请参阅校对规则文档。
如果未指定校对规则,但集合具有默认校对规则(请参见db.createCollection()),则该操作将使用为集合指定的校对规则。
如果没有为集合或操作指定校对规则,MongoDB将使用以前版本中使用的简单二进制比较进行字符串比较。不能为一个操作指定多个校对规则。例如,不能为每个字段指定不同的校对规则,或者如果使用排序执行查找,则不能将一个校对规则用于查找,另一个校对规则用于排序。
3.4版新增。
arrayFilters array 可选。一个筛选文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素。在更新文档中,使用[],s[]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符([],s_[]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符([],s[​]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符([标识符])都必须指定一个对应的数组筛选器文档。也就是说,不能为同一标识符指定多个数组筛选器文档。3.6版+
hint document 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’:{gte:ISODate(′2021−07−06T02:00:00Z′),gte:ISODate('2021-07-06T02:00:00Z'),gte:ISODate(′2021−07−06T02: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, and,and,and,not,$nor

MongoDB相关命令相关推荐

  1. mongodb常用命令

    mongodb常用命令 mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-pe ...

  2. linux命令看文件内容,Linux文件内容查看相关命令

    1.more命令 在Linux中,more命令是一个基于vi编辑器的文本过滤器,它能以全屏的方式按页显示文本文件的内容,more里面内置了一些快捷键. (1)命令语法 more(选项)(参数) (2) ...

  3. MongoDB——常用命令

    小黄自我修炼之Mongo篇,课程视频来自于黑马程序员 点击跳转 关于Mongo的简介和安装网上一搜一大堆,小黄的博客用来记录如何使用Mongo 本文的例子来自于现实中出现的情况:文章评论功能,自始至终 ...

  4. MongoDB 常用命令汇总

    MongoDB 常用命令汇总 mongodb数据库结构与传统关系型数据库对比 MongoDB 创建数据库 创建/切换数据库 查看当前数据库名称 查看所有数据库 MongoDB 删除数据库 删除集合 M ...

  5. Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)

    1. keys 键相关命令 命令 说明 dbsize 返回当前数据路的key数量 exists key 测试指定key是否存在 expire key seconds 为key指定过期时间 type k ...

  6. 连接状态_TCP 连接状态及相关命令学习

    在平时的开发工作中,我们都使用被封装完好的 TCP/HTTP 库去完成需求开发,很少关心底层 TCP 的连接状态,但是一旦遇到较难定位的线上事故,往往都是因为 TCP 连接参数或者使用姿势不对导致的, ...

  7. Udacity机器人软件工程师课程笔记(八)-ROS Turtlesim 包的相关命令

    Turtlesim 包的相关命令 这个部分包含五个子主题,分别是 列出所有活动节点 列出所有主题 获取有关主题的信息 显示消息信息 实时回应消息 1.列出所有的活动节点 为了获取所用的活动且向ROS ...

  8. linux账号管理命令,linux账号管理及相关命令和操作

    用户和组 用户: 1:用户和UID对应 2:用户需要有权限才能读.写.执行其他用户的文件 组: 1:组和GID对应 2:用户需要加到组中 3:每个用户都有自己的默认组,可以附加到其他的组 4:同组的用 ...

  9. CentOS 7 相关命令

    Centos 7 相关命令 查看Linux内核/操作系统/CPU # uname -a 查看系统位数是64位还是32位 # getconf LONG_BIT 检验java是否安装成功 # java - ...

最新文章

  1. 学习笔记-安装ELK5
  2. Bootstrap(自助法),Bagging,Boosting(提升)
  3. 【Qt教程】Qt常用部件介绍
  4. ArcGIS Python
  5. 银行柜员网申计算机水平要求高吗,银行网申没通过,是因为你水平差吗?
  6. python语义分析_Python差异的潜在语义分析
  7. 事务复制提示初始快照不可用_「MySQL」数据库事务深入分析
  8. idea 创建 spring 配置文件
  9. InfluxDB-Python 操作实践
  10. 百度地图根据经纬度获取地址
  11. Windows server 2003网络服务之搭建服务器群集
  12. 动手学深度学习(四十三)——机器翻译及其数据构建
  13. 一、Java虚拟机概述与JVM结构
  14. python链家数据分析统计服_Python数据分析实战-链家北京二手房价分析
  15. 干货 | 超级全面的电容知识
  16. 数字门店要怎么运营,才能助力线下门店降本增效?
  17. 【C语言】强符号和弱符号
  18. 网页爬虫为什么需要爬虫ip
  19. 考研英语 - word-list-50
  20. 凤凰网读书频道源代码泄露漏洞

热门文章

  1. 新手站长如何选择和优化网站关键词?
  2. 通过查看端口状态查看mongodb是否已经启动
  3. 新手站长如何快速学习并实践SEO?
  4. 【04】进阶:Git系统中的分支操作与管理
  5. Redis2.8从入门到精通文档
  6. 学习笔记--实现类似酷狗音乐歌词的效果
  7. vue移动端项目实现真机调试
  8. php graphviz,php graphviz
  9. 随机数公式生成一个负数和正数之间的数_Excel中如何生成12个[-1,1]的随机数,要求连续正数与负数不能超过2个。...
  10. ssm框架sql换成MySQL_SSM框架之mybatis