需求概述
需求:存放文章评论的数据存放到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才能查看到。
保留库
- admin
从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。 - local
这个数据库永远不会被复制,可以用来存储限于本地单台服务器的任意集合。 - 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
集合的命名规范:
- 集合名不能是空字符串“”。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以“system.”开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
集合的隐式创建
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。
文档的插入部分,会详细讲解。
提示:通常我们都是隐式创建集合。
集合的删除
集合删除的语法格式:
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 })
提示:
- comment集合如果不存在,则会隐式创建。
- mongo中的数字,默认情况下是double类型,如果要存储整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
- 插入当前日志使用new Date()。
- 插入的数据没有指定_id,会自动生成主键值。
- 如果某字段没值,可以赋值为null,或不写该字段。
执行后,如下,说明插入一个数据成功了。
WriteResult({ "nInserted" : 1 })
注意:
- 文档中键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键就是字符串。除了少数例外情况,键可以是任意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 | 可选。指定要在于查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有自动,请省略此参数。 |
- 示例
- 查询所有
如果我们要查询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" }
>
注意:
- projection 也是Json格式的,相当于指定需要显示的字段,和select后面写明列功能一致。
- 如果想显示某个字段,字段名: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后面的值。 |
upsert | boolean | 可选。如果设置为true,则在没有与查询条件匹配的文档时创建新文档。默认值为false,如果找不到匹配项,则不会插入新文档。 |
multi | boolean | 可选。如果设置为true,则更新符号查询条件的多个文档。如果设置为false,则更新一个文档,默认值为false。 |
writeConcern | document | 可选。表示写问题的文档,抛出异常的级别。 |
collation | document | 可选。 指定要用于操作的校对规则。 校对规则允许用哪个好为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。 校对规则选项具有以下语法: 校对规则:{ 区域设置:, caseLevel:, caseFirst:, 强度:, numericordering:, 替代:, 最大变量:, 向后: } 指定校对规则时,区域设置字段时必需的;所有其他校对规则字段都是可选的。有关字段的说明,请参阅校对规则文档。 如果未指定校对规则,但集合具有默认校对规则(请参见db.createCollection()),则该操作将使用为集合指定的校对规则。 如果没有为集合或操作指定校对规则,MongoDB将使用以前版本中使用的简单二进制比较进行字符串比较。不能为一个操作指定多个校对规则。例如,不能为每个字段指定不同的校对规则,或者如果使用排序执行查找,则不能将一个校对规则用于查找,另一个校对规则用于排序。 3.4版新增。 |
arrayFilters | array | 可选。一个筛选文档数组,用于确定要为数组字段上的更新操作修改哪些数组元素。在更新文档中,使用
[ ] , s [ ] 筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意, < i d e n t i f i e r > 必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符( [],s_[]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符( [],s[]筛选的位置运算符来定义标识符,然后在数组过滤器文档中引用。如果标识符未包含在更新文档中,则不能有标识符的数组筛选器文档。注意,<identifier>必须以小写字母开头,并且只包含字母数字字符。您可以在更新文档中多次包含同一标识符;但是,更新文档中,每个不同的标识符([标识符])都必须指定一个对应的数组筛选器文档。也就是说,不能为同一标识符指定多个数组筛选器文档。3.6版+ |
hint | document or string | 可选。指定用于支持查询谓词的索引的文档或字符串。该选项可以采用索引规范文档或索引名称字符串。如果指定的索引不存在,则说明操作错误。例如,请参阅版本4中的为更新操作指定提示。 |
提示:
主要关注前四个参数即可。
示例:
- 覆盖的修改
如果我们想修改_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 }
- 批量的修改
更新所有用户为1003的用户的昵称为凯撒大帝。
// 默认只修改第一条数据
db.comment.update({userid:"1003"}, {$set:{nickname:"凯撒"}})
// 修改所有符号条件的数据
db.comment.update({userid:"1003"}, {$set:{nickname:"凯撒大帝"}}, {multi:true})
提示:
如果不加后面的参数,则只更新符号条件的第一条记录。
- 列值增长的修改
如果我们想实现某列值在原有值的基础上进行增加或减少,可以使用$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 | 可选。用于修改计算的额外选项。 |
提示:
可选项暂时不使用。
示例:
- 统计所有记录数:
统计comment集合所有的记录数:
> db.comment.count()
5
- 按条件统计记录数
例如:统计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(′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({})
参考
a
n
d
,
and,
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100358.html