【MongoDB学习笔记1】MongoDB的常用命令介绍-数据库操作、集合操作、文档操作、文档分页查询、高级查询

1 基本常用命令

1.1 数据库操作

  1. 数据库添加

MongoDB中默认的数据库为test,如果没有选择数据库,集合将会存放在test数据库中。

选择和创建数据库,如果数据库存在则使用这个数据库,如果数据库不存在则自动创建

复制代码
test> use testdb
switched to db testdb
testdb> 

在MongoDB中,集合只有在内容插入后才会创建,就是说,创建集合后要再插入一个文档(记录),集合才会真正创建。

复制代码
test> use testdb
switched to db testdb
testdb> show databases
admin    40.00 KiB
config  108.00 KiB
local    40.00 KiB

创建了库,但是系统中没有显示,因为先创建的库只保存在内存中,当创建集合后,系统会自动将新创建的库持久化,这时候才能查看到库

数据库的命名规则:

  • 不能是空字符串
  • 不能含空格、.$/\
  • 应该全部使用小写
  • 最多64字节

有些数据库名是保留的,可以直接访问这些有特殊作用的数据库

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

    testdb> db
    testdb
    testdb> db.dropDatabase()
    { ok: 1, dropped: 'testdb' }

主要用来删除已经持久化的数据库

1.2 集合的操作

1.2.1 显示创建

显示创建就是通过相关命令去创建的一个空的集合

复制代码
testdb> db.createCollection("c1")		# 括号内跟名字,名字一定会要加引号
{ ok: 1 }
testdb> show dbs				# 创建了集合,数据库立即被持久化
admin   40.00 KiB
config  96.00 KiB
local   40.00 KiB
testdb   8.00 KiB
testdb> show collections			# 命令可以用tab补齐
c1

集合命名规范:

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

1.2.2 集合的隐式创建

当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。这是通常使用的方法

1.2.3 集合的删除

语法:

复制代码
db.collection.drop()
或
db.集合名.drop()

成功删除则返回true

复制代码
testdb> db.c1.drop()
true
testdb> show collections

testdb> show dbs
admin   40.00 KiB
config  96.00 KiB
local   40.00 KiB

1.3 文档的操作

文档的数据结构和JSON基本一样,所有存储在接种的数据都是BSON格式。

1.3.1 文档的插入

单次插入

使用insert()或save()方法向集合中插入文档,语法如下:

json 复制代码
db.collection.insert(
    <document or array of documents>,
    {
      writeConcern: <document>,
      ordered: <boolean>
  }
)

参数:

Parameter Type Description
collection 集合的名字,如果没有则创建
document document or array 要插入到集合中的文档或文档数组(JSON格式)
writeConcern document 可选,选择插入时选择的性能和可靠性级别
ordered boolean 可选,如果为真,则按顺序插入数组中的文档,如果其中一个文档出现错误,MongoDB将返回而不处理数组中的其余文档;如果为假,则执行无序插入,如果其中一个文档出现错误,则继续处理数组中的空文档。在版本2.6+中默认为true。

例如:向comment集合中插入一个文档

复制代码
testdb> show collections
testdb> db.comment.insert({"articleid":"100000","content":"Today is a good day.","userid":"1001","nickname":"Bruce","createdatetime":new Date(),"likenum":NumberInt(10),"state":null})
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{
  acknowledged: true,
  insertedIds: { '0': ObjectId('66690ec9eb2803c6e0a26a13') }
}
testdb> show collections
comment
testdb> db.comment.find()
[
  {
    _id: ObjectId('66690ec9eb2803c6e0a26a13'),		#系统自动生成的
    articleid: '100000',
    content: 'Today is a good day.',
    userid: '1001',
    nickname: 'Bruce',
    createdatetime: ISODate('2024-06-12T02:58:17.876Z'),
    likenum: 10,
    state: null
  }
]

操作注意事项:

  1. 如果集合不存在,则会隐式创建
  2. Mongo中的数字,默认情况下是double类型,如果要存整型,必须使用Numb二In他,否则取出来就会有问题
  3. 插入当前日期使用new Data()
  4. 插入的数据没有指定_id,系统会自动生成,这也是默认的主键
  5. 如果某字段没有值,可以赋值为null,或不写该字段

注意:

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

文档命名规范
➊键不能含有\0(空字符)。这个字符用来表示键的结尾
.$有特别的意义,只有在特定环境下才能使用
➌以下划线开头的键是保留的(不是严格要求的)

批量插入

语法:

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

插入多条文档

js 复制代码
testdb> db.comment.insertMany([
{"_id": "1","articleid":"100001","content":"I like music.","userid":"1015","nickname":"Tony","createdatetime":new Date(),"likenum":NumberInt(666),"state":"Online"},
{"_id": "2","articleid":"100001","content":"Good good study, day day up.","userid":"1010","nickname":"Joe","createdatetime":new Date(),"likenum":NumberInt(888),"state":"offline"},
{"_id": "3","articleid":"100001","content":"Long time no see.","userid":"1013","nickname":"Jerry","createdatetime":new Date(),"likenum":NumberInt(888),"state":"offline"}
]);
{ acknowledged: true, insertedIds: { '0': '1', '1': '2', '2': '3' } }

可以不用指定id

js 复制代码
testdb> db.comment.insertMany([
... {"articleid":"100001","content":"Life is hard.","userid":"1025","nickname":"Tony","createdatetime":new Date(),"likenum":NumberInt(666),"state":"Online"},
... {"articleid":"100001","content":"Good job.","userid":"1001","nickname":"Bruce","createdatetime":new Date(),"likenum":NumberInt(888),"state":"offline"}
... ]);
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId('6669446aeb2803c6e0a26a14'),
    '1': ObjectId('6669446aeb2803c6e0a26a15')
  }
}
  • 插入时指定了_id,则主键就是该值

  • 如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。

  • 在批量插入时由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理

    try {
    db.comment.insertMany([
    {"_id": "1","articleid":"100001","content":"I like music.","userid":"1015","nickname":"Tony","createdatetime":new Date(),"likenum":NumberInt(666),"state":"Online"},
    {"_id": "2","articleid":"100001","content":"Good good study, day day up.","userid":"1010","nickname":"Joe","createdatetime":new Date(),"likenum":NumberInt(888),"state":"offline"},
    {"_id": "3","articleid":"100001","content":"Long time no see.","userid":"1013","nickname":"Jerry","createdatetime":new Date(),"likenum":NumberInt(888),"state":"offline"}
    ]);
    } catch(e){
    print(e);
    }

1.3.2 文档的查询

文档查询的语法格式如下:

js 复制代码
db.collection.find(<query, [projection])

参数:

Parameter Type Description
query document 可选。使用查询运算符制定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递空文档({})。
projection document 可选。指定要在与查询筛选器匹配的文档中返回的字段(投影)。若要返回匹配文档中的所有字段,可以省略此参数。

1)查询所有

js 复制代码
testdb> db.comment.find()
[
  {
    _id: ObjectId('66690ec9eb2803c6e0a26a13'),
    articleid: '100000',
    content: 'Today is a good day.',
    userid: '1001',
    nickname: 'Bruce',
    createdatetime: ISODate('2024-06-12T02:58:17.876Z'),
    likenum: 10,
    state: null
  },
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: 'Tony',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 666,
    state: 'Online'
  },
...
]

每条文档都会有一个叫_id的字段,这相当于原来关系数据库中表的主键,当插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。

在插入文档记录时也可以指定该字段,可以是ObjectID类型和其他MongoDB支持的任意类型。

指定内容查询

js 复制代码
testdb> db.comment.find({articleid:"100001"})
[
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: 'Tony',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 666,
    state: 'Online'
  },
  {
    _id: '2',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 888,
    state: 'offline'
  },
  {
    _id: '3',
    articleid: '100001',
    content: 'Long time no see.',
    userid: '1013',
    nickname: 'Jerry',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 888,
    state: 'offline'
  },
  {
    _id: ObjectId('6669446aeb2803c6e0a26a14'),
    articleid: '100001',
    content: 'Life is hard.',
    userid: '1025',
    nickname: 'Tony',
    createdatetime: ISODate('2024-06-12T06:47:06.677Z'),
    likenum: 666,
    state: 'Online'
  },
  {
    _id: ObjectId('6669446aeb2803c6e0a26a15'),
    articleid: '100001',
    content: 'Good job.',
    userid: '1001',
    nickname: 'Bruce',
    createdatetime: ISODate('2024-06-12T06:47:06.677Z'),
    likenum: 888,
    state: 'offline'
  }
]
testdb> db.comment.findOne({articleid:"100001"})	# 返回查询到的第一条数据
{
  _id: '1',
  articleid: '100001',
  content: 'I like music.',
  userid: '1015',
  nickname: 'Tony',
  createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
  likenum: 666,
  state: 'Online'
}
  1. 投影查询

如果要查询结果返回部分字段,则需要使用投影查询(不现实所有字段,只显示指定字段)

投影查询类似于SQL语句中的select某些字段。

js 复制代码
testdb> db.comment.find({userid:"1001"},{userid:1,nickname:1})		#后面跟1代表显示该字段
[
  {
    _id: ObjectId('66690ec9eb2803c6e0a26a13'),
    userid: '1001',
    nickname: 'Bruce'
  },
  {
    _id: ObjectId('6669446aeb2803c6e0a26a15'),
    userid: '1001',
    nickname: 'Bruce'
  },
  {
    _id: ObjectId('6682796ca72ffdbb1ca26a13'),
    userid: '1001',
    nickname: 'Bruce'
  }
]

# 默认会显示_ID,也可以选择不现实

testdb> db.comment.find({userid:"1001"},{userid:1,nickname:1,_id:0})
[
  { userid: '1001', nickname: 'Bruce' },
  { userid: '1001', nickname: 'Bruce' },
  { userid: '1001', nickname: 'Bruce' }
]

1.3.3 文档的更新

语法结构

js 复制代码
db.collection.update(query, update, options)
或
db.collection.update(
    <query>,
    <update>,
    {
      upsert: <boolean>,
      multi: <boolean>,
      writeConcern: <document>,
      collation: <document>.
      arrayFilters: [<filterdocumentl>, ...],
      hint:<document|string>
    }
)

参数

Parameter Type Description
query document 更新的选择条件。可以使用与find()方法中相同的查询选择器,类似sql update查询内where后面的。在3.0版中进行了更改:当使用upsert:true执行update()时,如果查询使用点表示法在_id字段上制定条件,则MongoDB将拒绝插入新文档。
update document or pipeline 要应用的修改。该值可以是:包含更新运算符表达式的文档,或仅包含:对的替换文档,或在MongoDB 4.2中启动聚合管道。管道可以有以下阶段组成:$addFields及其别名$set$project及其别名$unset$replaceroot及其别名$replaceWith。换句话说,它是update的对象和一些更新的操作符,也可以理解为sql update查询内set后面的值。
upsert boolean 可选,如果设置为true,则在没有与查询条件匹配的文档时创建新文档。默认值为false,如果炸不到匹配项,则不会插入新文档
multi boolean 可选,如果设置为true,则更新符合查询的多个文档。如果设置为false,则更新一个文档。默认值为false。
writeConcern document 可选,表示些问题的文档。抛出异常的级别
collation document 可选。 指定用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
arrayFilters array 可选。一个筛选器文档数组,确定要针对数组字段的更新操作修改哪些数组元素。 在更新文档中,使用$[<identifier>]筛选后的位置运算符来定义标识符,然后在数组筛选文档中引用该标识符。如果更新文档中未包含某一标识符,则无法获得该标识符的数组筛选文档。

排序规则选项的语法如下:

复制代码
collation: {
   locale: <string>,
   caseLevel: <boolean>,
   caseFirst: <string>,
   strength: <int>,
   numericOrdering: <boolean>,
   alternate: <string>,
   maxVariable: <string>,
   backwards: <boolean>
}

1) 覆盖的修改

如果我们想修改_id为1的记录,将点赞量改为1001,输入一下语句:

复制代码
testdb> db.comment.updateOne({_id:"1"},{likenum:NumberInt(1001)})
MongoInvalidArgumentError: Update document requires atomic operators

该操作显示失败:显示参数错误,具体的解释如下:

MongoInvalidArgumentError是MongoDB数据库中的一个错误类型,表示传递给更新操作的参数存在问题,无法执行更新操作。具体来说,MongoInvalidArgumentError: 更新文档需要原子运算符的错误表示在执行更新操作时,需要使用原子运算符来指定更新的具体操作。

原子运算符是MongoDB中用于执行特定操作的操作符,可以在更新操作中使用。常见的原子运算符包括$set$unset$inc$push$pull等。通过使用这些原子运算符,可以对文档进行精确的更新操作,而不是简单地替换整个文档。

2) 局部修改

解决的办法就是局部修改,使用修改器$set来实现,例如:

复制代码
testdb> db.comment.update({userid:'1015'},{$set:{nickname:"托尼"}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
testdb> db.comment.find({_id:"1"})
[
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: '托尼',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 666,
    state: 'Online'
  }
]

3) 批量修改

复制代码
testdb> db.comment.find({articleid: '100001'})
[
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: '托尼',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 666,
    state: 'Online'
  },
...
  {
    _id: ObjectId('6669446aeb2803c6e0a26a15'),
    articleid: '100001',
    content: 'Good job.',
    userid: '1001',
    nickname: 'Bruce',
    createdatetime: ISODate('2024-06-12T06:47:06.677Z'),
    likenum: 888,
    state: 'offline'
  }
]
testdb> db.comment.update({articleid:'100001'},{$set:{likenum:NumberInt(1000)}},{multi:true})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 5,
  modifiedCount: 5,
  upsertedCount: 0
}
testdb> db.comment.find({articleid: '100001'})
[
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: '托尼',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 1000,
    state: 'Online'
  },
...
  {
    _id: ObjectId('6669446aeb2803c6e0a26a15'),
    articleid: '100001',
    content: 'Good job.',
    userid: '1001',
    nickname: 'Bruce',
    createdatetime: ISODate('2024-06-12T06:47:06.677Z'),
    likenum: 1000,
    state: 'offline'
  }
]

不设置multi的情况下,只修改匹配的第一条数据

另一种方法:

复制代码
testdb> db.comment.updateMany({articleid:'100001'},{$set:{likenum:NumberInt(1005)}})

4) 列值增长修改

如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用$inc运算符来实现

复制代码
testdb> db.comment.update({_id:'2'},{$inc:{likenum:NumberInt(3)}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
testdb> db.comment.find({_id: '2'})
[
  {
    _id: '2',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 1008,
    state: 'offline'
  }
]

减少

复制代码
testdb> db.comment.update({_id:'2'},{$inc:{likenum:NumberInt(-10)}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
testdb> db.comment.find({_id: '2'})
[
  {
    _id: '2',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-06-12T06:43:56.519Z'),
    likenum: 998,
    state: 'offline'
  }
]

1.3.4 删除文档

删除单条

复制代码
testdb> db.comment.remove({_id:"1"})
DeprecationWarning: Collection.remove() is deprecated. Use deleteOne, deleteMany, findOneAndDelete, or bulkWrite.
{ acknowledged: true, deletedCount: 1 }
testdb> db.comment.find({_id: '1'})

testdb> db.comment.deleteOne({_id:"6669446aeb2803c6e0a26a15"})
{ acknowledged: true, deletedCount: 0 }

删除多条

复制代码
testdb> db.comment.deleteMany({state: 'offline'})
{ acknowledged: true, deletedCount: 3 }

全部删除

复制代码
testdb> db.comment.remove({})
{ acknowledged: true, deletedCount: 3 }

1.4 文档的分页查询

1.4.1 统计查询

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

复制代码
db.collection.count(querry,options)

参数:

Parameter Type Description
querry document 查询选择条件
options document 可选,用于修改计数的额外选项

直接查询和带条件查询

复制代码
testdb> db.comment.count()
6
testdb> db.comment.count({_id:"3"})
1

1.4.2 分页列表查询

使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据

  1. 如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值是20
js 复制代码
testdb> db.comment.find().limit(2)
[
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: 'Tony',
    createdatetime: ISODate('2024-07-03T07:55:34.266Z'),
    likenum: 666,
    state: 'Online'
  },
  {
    _id: '2',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-07-03T07:55:34.266Z'),
    likenum: 888,
    state: 'offline'
  }
]
  1. skip方法同样接受一个数字参数作为跳过的记录条数,(前N个数据不要),默认是0

    testdb> db.comment.find().skip(5)
    [
    {
    _id: '6',
    articleid: '100001',
    content: 'Long time no see.',
    userid: '1013',
    nickname: 'Jerry',
    createdatetime: ISODate('2024-07-03T08:11:58.397Z'),
    likenum: 888,
    state: 'offline'
    }
    ]

新版本的skip里面必须要填数字了

分页查询需求:每页两个,第二页跳过前两条数据,第三页跳过前4条数据...

复制代码
# 第一页,跳过0,显示2条
testdb> db.comment.find().skip(0).limit(2)
[
  {
    _id: '1',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: 'Tony',
    createdatetime: ISODate('2024-07-03T07:55:34.266Z'),
    likenum: 666,
    state: 'Online'
  },
  {
    _id: '2',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-07-03T07:55:34.266Z'),
    likenum: 888,
    state: 'offline'
  }
]
# 第二页,跳过2条,显示2条
testdb> db.comment.find().skip(2).limit(2)
[
  {
    _id: '3',
    articleid: '100001',
    content: 'Long time no see.',
    userid: '1013',
    nickname: 'Jerry',
    createdatetime: ISODate('2024-07-03T07:55:34.266Z'),
    likenum: 888,
    state: 'offline'
  },
  {
    _id: '4',
    articleid: '100001',
    content: 'I like music.',
    userid: '1015',
    nickname: 'Tony',
    createdatetime: ISODate('2024-07-03T08:11:58.397Z'),
    likenum: 666,
    state: 'Online'
  }
]
# 第三页,跳过4条,显示2条
testdb> db.comment.find().skip(4).limit(2)
[
  {
    _id: '5',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-07-03T08:11:58.397Z'),
    likenum: 888,
    state: 'offline'
  },
  {
    _id: '6',
    articleid: '100001',
    content: 'Long time no see.',
    userid: '1013',
    nickname: 'Jerry',
    createdatetime: ISODate('2024-07-03T08:11:58.397Z'),
    likenum: 888,
    state: 'offline'
  }
]

1.4.3 排序查询

sort()方法对数据进行排序,它可以通过参数指定排序的字段,并使用1(升序)和-1(降序)来制定排序的方式。

对_id进行降序排序

复制代码
testdb> db.comment.find().sort({_id:-1})
[
  {
    _id: '6',
    articleid: '100001',
    content: 'Long time no see.',
    userid: '1013',
    nickname: 'Jerry',
    createdatetime: ISODate('2024-07-03T08:11:58.397Z'),
    likenum: 888,
    state: 'offline'
  },
  {
    _id: '5',
    articleid: '100001',
    content: 'Good good study, day day up.',
    userid: '1010',
    nickname: 'Joe',
    createdatetime: ISODate('2024-07-03T08:11:58.397Z'),
    likenum: 888,
    state: 'offline'
  },
...

支持条件组合,但是只有在第一个排序条件相等的情况下才会去考虑第二个排序条件

复制代码
testdb> db.comment.find({},{likenum:1}).sort({_id:-1,likenum:1})
[
  { _id: '6', likenum: 888 },
  { _id: '5', likenum: 888 },
  { _id: '4', likenum: 666 },
  { _id: '3', likenum: 888 },
  { _id: '2', likenum: 888 },
  { _id: '1', likenum: 666 }
]

skip()limit()sort()三个放在一起的时候,执行的先后顺序是sort()skip()limit(),和命令编写顺序无关

1.5 高级查询

1.5.1 正则的复杂条件查询

MongoDB的模糊查询是通过正则表达式的方式来实现的。正则表达式是js的语法,直接量的写法

复制代码
# 查询评论包含like字段的内容
testdb> db.comment.find({content:/like/},{content:1})
[
  { _id: '1', content: 'I like music.' },
  { _id: '4', content: 'I like music.' }
]
# 查询以like开头的评论
testdb> db.comment.find({content:/^like/},{content:1})

1.5.2 比较查询

通常用到的有(value是你输入的值):

  • field<value:lt

  • field>value:gt

  • field<=value:lte

  • field>=value:gte

  • field!=value:ne

    testdb> db.comment.find({likenum:{gt:800}},{likenum:1}) # 大于800 [ { _id: '2', likenum: 888 }, { _id: '3', likenum: 888 }, { _id: '5', likenum: 888 }, { _id: '6', likenum: 888 } ] testdb> db.comment.find({likenum:{lt:800}},{likenum:1}) # 小于800
    [ { _id: '1', likenum: 666 }, { _id: '4', likenum: 666 } ]
    testdb> db.comment.find({likenum:{gte:888}},{likenum:1}) # 大于等于888 [ { _id: '2', likenum: 888 }, { _id: '3', likenum: 888 }, { _id: '5', likenum: 888 }, { _id: '6', likenum: 888 } ] testdb> db.comment.find({likenum:{lte:666}},{likenum:1}) # 小于等于666
    [ { _id: '1', likenum: 666 }, { _id: '4', likenum: 666 } ]
    testdb> db.comment.find({likenum:{$ne:666}},{likenum:1}) # 不等于666
    [
    { _id: '2', likenum: 888 },
    { _id: '3', likenum: 888 },
    { _id: '5', likenum: 888 },
    { _id: '6', likenum: 888 }
    ]

如果查询不到,可以使用NumberInt将输入的值转换一下

1.5.3 包含查询

使用$in操作符号

查询userid包含1015和1010的

复制代码
testdb> db.comment.find({userid:{$in:["1015","1010"]}},{userid:1})
[
  { _id: '1', userid: '1015' },
  { _id: '2', userid: '1010' },
  { _id: '4', userid: '1015' },
  { _id: '5', userid: '1010' }
]

$nin方法排除userid是1015和1010的条目

复制代码
testdb> db.comment.find({userid:{$nin:["1015","1010"]}},{userid:1})
[ { _id: '3', userid: '1013' }, { _id: '6', userid: '1013' } ]

即使只有一个条件,也需要使用数组

1.5.4 条件连接查询

原始数据

复制代码
testdb> db.comment.find({},{userid:1,content:1})
[
  { _id: '1', content: 'I like music.', userid: '1015' },
  { _id: '2', content: 'Good good study, day day up.', userid: '1010' },
  { _id: '3', content: 'Long time no see.', userid: '1013' },
  { _id: '4', content: 'I like music.', userid: '1015' },
  { _id: '5', content: 'Good good study, day day up.', userid: '1010' },
  { _id: '6', content: 'Long time no see.', userid: '1013' }

同时满足两个条件,使用$and方法

复制代码
# 匹配userid是1015或1010的共有4条数据,如果再加上后面的条件,就只有两条数据

testdb> db.comment.find({$and:[{userid:{$in:["1015","1010"]}},{content:/Good/}]},{userid:1,content:1})
[
  { _id: '2', content: 'Good good study, day day up.', userid: '1010' },
  { _id: '5', content: 'Good good study, day day up.', userid: '1010' }
]

满足其中一个条件:

复制代码
# 满足第一个条件的有两条数据,第二个条件的也有两条数据,因此总共四条数据

testdb> db.comment.find({$or:[{userid:{$in:["1015"]}},{content:/Good/}]},{userid:1,content:1})
[
  { _id: '1', content: 'I like music.', userid: '1015' },
  { _id: '2', content: 'Good good study, day day up.', userid: '1010' },
  { _id: '4', content: 'I like music.', userid: '1015' },
  { _id: '5', content: 'Good good study, day day up.', userid: '1010' }
]
相关推荐
JIngJaneIL10 分钟前
专利服务系统平台|个人专利服务系统|基于java和小程序的专利服务系统设计与实现(源码+数据库+文档)
java·数据库·小程序·论文·毕设·专利服务系统平台
freed_Day22 分钟前
Java学习进阶--集合体系结构
java·开发语言·学习
__风__29 分钟前
windows 上编译PostgreSQL
数据库·postgresql
木木子99991 小时前
数据库范式
数据库
涛思数据(TDengine)1 小时前
通过最严时序标准,再登产业图谱榜首,TDengine 时序数据库在可信数据库大会荣获双荣誉
大数据·数据库·时序数据库·tdengine·涛思数据
涛思数据(TDengine)1 小时前
新客户 | TDengine 时序数据库是怎么在钢厂“撬动”PI 的?
大数据·运维·数据库·时序数据库·tdengine
程序员柳1 小时前
基于Flask + Vue3 的新闻数据分析平台源代码+数据库+使用说明,爬取今日头条新闻数据,采集与清洗、数据分析、建立数据模型、数据可视化
数据库·数据分析·flask
饭碗、碗碗香2 小时前
【Dify学习笔记】:Dify搭建表单信息提交系统
人工智能·笔记·学习·ai
哈基米喜欢哈哈哈2 小时前
Uber的MySQL实践(一)——学习笔记
数据库·笔记·后端·mysql
编程研究坊2 小时前
Neo4j APOC插件安装教程
数据库·人工智能·python·neo4j