MongoDB相关命令
需求概述
需求:存放文章评论的数据存放到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中启动聚合管道。管道可以由以下阶段组成: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中的为更新操作指定提示。 |
提示:
主要关注前四个参数即可。
示例:
- 覆盖的修改
如果我们想修改_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’:{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相关命令相关推荐
- mongodb常用命令
mongodb常用命令 mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理.关于它的一个最简洁描述为:scalable, high-pe ...
- linux命令看文件内容,Linux文件内容查看相关命令
1.more命令 在Linux中,more命令是一个基于vi编辑器的文本过滤器,它能以全屏的方式按页显示文本文件的内容,more里面内置了一些快捷键. (1)命令语法 more(选项)(参数) (2) ...
- MongoDB——常用命令
小黄自我修炼之Mongo篇,课程视频来自于黑马程序员 点击跳转 关于Mongo的简介和安装网上一搜一大堆,小黄的博客用来记录如何使用Mongo 本文的例子来自于现实中出现的情况:文章评论功能,自始至终 ...
- MongoDB 常用命令汇总
MongoDB 常用命令汇总 mongodb数据库结构与传统关系型数据库对比 MongoDB 创建数据库 创建/切换数据库 查看当前数据库名称 查看所有数据库 MongoDB 删除数据库 删除集合 M ...
- Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
1. keys 键相关命令 命令 说明 dbsize 返回当前数据路的key数量 exists key 测试指定key是否存在 expire key seconds 为key指定过期时间 type k ...
- 连接状态_TCP 连接状态及相关命令学习
在平时的开发工作中,我们都使用被封装完好的 TCP/HTTP 库去完成需求开发,很少关心底层 TCP 的连接状态,但是一旦遇到较难定位的线上事故,往往都是因为 TCP 连接参数或者使用姿势不对导致的, ...
- Udacity机器人软件工程师课程笔记(八)-ROS Turtlesim 包的相关命令
Turtlesim 包的相关命令 这个部分包含五个子主题,分别是 列出所有活动节点 列出所有主题 获取有关主题的信息 显示消息信息 实时回应消息 1.列出所有的活动节点 为了获取所用的活动且向ROS ...
- linux账号管理命令,linux账号管理及相关命令和操作
用户和组 用户: 1:用户和UID对应 2:用户需要有权限才能读.写.执行其他用户的文件 组: 1:组和GID对应 2:用户需要加到组中 3:每个用户都有自己的默认组,可以附加到其他的组 4:同组的用 ...
- CentOS 7 相关命令
Centos 7 相关命令 查看Linux内核/操作系统/CPU # uname -a 查看系统位数是64位还是32位 # getconf LONG_BIT 检验java是否安装成功 # java - ...
最新文章
- 学习笔记-安装ELK5
- Bootstrap(自助法),Bagging,Boosting(提升)
- 【Qt教程】Qt常用部件介绍
- ArcGIS Python
- 银行柜员网申计算机水平要求高吗,银行网申没通过,是因为你水平差吗?
- python语义分析_Python差异的潜在语义分析
- 事务复制提示初始快照不可用_「MySQL」数据库事务深入分析
- idea 创建 spring 配置文件
- InfluxDB-Python 操作实践
- 百度地图根据经纬度获取地址
- Windows server 2003网络服务之搭建服务器群集
- 动手学深度学习(四十三)——机器翻译及其数据构建
- 一、Java虚拟机概述与JVM结构
- python链家数据分析统计服_Python数据分析实战-链家北京二手房价分析
- 干货 | 超级全面的电容知识
- 数字门店要怎么运营,才能助力线下门店降本增效?
- 【C语言】强符号和弱符号
- 网页爬虫为什么需要爬虫ip
- 考研英语 - word-list-50
- 凤凰网读书频道源代码泄露漏洞
热门文章
- 新手站长如何选择和优化网站关键词?
- 通过查看端口状态查看mongodb是否已经启动
- 新手站长如何快速学习并实践SEO?
- 【04】进阶:Git系统中的分支操作与管理
- Redis2.8从入门到精通文档
- 学习笔记--实现类似酷狗音乐歌词的效果
- vue移动端项目实现真机调试
- php graphviz,php graphviz
- 随机数公式生成一个负数和正数之间的数_Excel中如何生成12个[-1,1]的随机数,要求连续正数与负数不能超过2个。...
- ssm框架sql换成MySQL_SSM框架之mybatis