MongoDB基本操作

1. 数据库操作

1.1 创建数据库

命令:

<!-- 该数据库不存在则创建,已存在则切换到此数据库 -->
use DATABASE_NAME

1.2 删除数据库

命令:

<!-- 切换数据库 -->
use DATABASE_NAME

<!-- 执行删除操作 -->
db.dropDatabase()

2. 集合操作

2.1 创建集合

命令:

<!-- 创建名称为“colName”的集合 -->
db.createCollection("colName")

<!--
options: 可选参数, 指定有关内存大小及索引的选项 
(
capped:如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档,当该值为 true 时,必须指定 size 参数;
autoIndexId:3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false;
size:为固定集合指定一个最大值,即字节数,如果 capped 为 true,必须指定该字段;
max:指定固定集合中包含文档的最大数量;
例:db.createCollection("colName", { capped : true, size : 1000000, max : 10000 } ) 
解释:创建固定集合“colName”,整个集合空间大小 1000000 KB, 文档最大个数为 10000 个
)
-->
db.createCollection("colName", options)

<!-- 查看已有集合 -->
show collections 
或
show tables

2.2 删除集合

命令:

db.colName.drop()

3. 文档操作

文档的数据结构和 JSON 基本一样,所有存储在集合中的数据都是 BSON 格式,BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。

3.1 插入文档

命令:

<!-- 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据 -->
db.COLLECTION_NAME.insert(document)

<!-- 如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.COLLECTION_NAME.insertOne() 或 db.COLLECTION_NAME.replaceOne() 来代替 -->
db.COLLECTION_NAME.save(document)

<!-- 
document:要写入的文档;
writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求;
ordered:指定是否按顺序写入,默认 true,按顺序写入;
-->
<!-- 向集合插入一个新文档 -->
db.COLLECTION_NAME.insertOne(
   <document>,
   {
      writeConcern: <document>
   }
) 

<!-- 向集合插入一个/多个文档 -->
db.COLLECTION_NAME.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
) 

3.2 修改文档

命令:

<!-- update() 用于更新已存在的文档 -->
<!-- 
query : update的查询条件,类似sql update查询内where后面的;
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的;
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入;
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新;
writeConcern :可选,抛出异常的级别;
-->
db.COLLECTION_NAME.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

<!-- save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入 -->
<!-- 
document : 文档数据;
writeConcern :可选,抛出异常的级别;
-->
db.COLLECTION_NAME.save(
   <document>,
   {
     writeConcern: <document>
   }
)

3.3 删除文档

命令:

<!-- remove() 函数是用来移除集合中的数据 -->
<!-- 
query :(可选)删除的文档的条件;
justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档;
writeConcern :(可选)抛出异常的级别;
-->
db.COLLECTION_NAME.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

<!-- remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法 -->
db.COLLECTION_NAME.deleteMany(<query>)
db.COLLECTION_NAME.deleteOne(<query>)

<!-- 
remove() 方法 并不会真正释放空间,需要继续执行 db.repairDatabase() 来回收磁盘空间 
-->
db.repairDatabase()
或
db.runCommand({ repairDatabase: 1 })

3.4 查询文档

命令:

<!-- find() 方法以非结构化的方式来显示所有文档 -->
<!-- findOne() 方法,它只返回一个文档 -->
<!-- 
query :可选,使用查询操作符指定查询条件;
projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略);
 -->
db.COLLECTION_NAME.find(query, projection)

<!-- pretty() 方法以格式化的方式来显示所有文档 -->
db.COLLECTION_NAME.find().pretty()
3.4.1 MongoDB 与 RDBMS Where 语句比较

小于(less than)
大于(greater than)

操作格式范例RDBMS中的类似语句
等于{:}db.col.find({“by”:“菜鸟教程”}).pretty()where by = ‘菜鸟教程’
小于{:{$lt:}}db.col.find({“likes”:{$lt:50}}).pretty()where likes < 50
小于或等于{:{$lte:}}db.col.find({“likes”:{$lte:50}}).pretty()where likes <= 50
大于{:{$gt:}}db.col.find({“likes”:{$gt:50}}).pretty()where likes > 50
大于或等于{:{$gte:}}db.col.find({“likes”:{$gte:50}}).pretty()where likes >= 50
不等于{:{$ne:}}db.col.find({“likes”:{$ne:50}}).pretty()where likes != 50
3.4.2 MongoDB AND 条件

命令:

<!-- find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件 -->
db.COLLECTION_NAME.find({key1:value1, key2:value2}).pretty()
3.4.3 MongoDB OR 条件

命令:

<!-- OR 条件语句使用了关键字 $or -->
db.COLLECTION_NAME.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()
3.4.4 MongoDB 条件操作符
操作操作符
>$gt
<$lt
>=$gte
<=$lte
3.4.5 模糊查询

命令:

<!-- 查询 title 包含"A"字的文档: -->
db.COLLECTION_NAME.find({title:/A/})

<!-- 查询 title 字段以"A"字开头的文档:-->
db.COLLECTION_NAME.find({title:/^A/})

<!-- 查询 title 字段以"A"字结尾的文档:-->
db.COLLECTION_NAME.find({title:/A$/})
3.4.6 MongoDB $type 操作符(数据类型)
类型数字
Double1
String2
Object3
Array4
Binary data5
Undefined6
Object id7
Boolean8
Date9
Null10
Regular Expression11
JavaScript13
Symbol14
JavaScript (with scope)15
32-bit integer16
Timestamp17
64-bit integer18
Min key255
Max key127

例:

<!-- 获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:-->
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
3.4.7 MongoDB Limit与Skip方法

MongoDB Limit() 方法
命令:

<!-- MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数 -->
db.COLLECTION_NAME.find().limit(NUMBER)

MongoDB Skip() 方法
命令:

<!-- skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数 -->
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
3.4.8 MongoDB 排序

MongoDB sort() 方法
命令:

<!-- sort() 方法对数据进行排序 -->
<!-- 
sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式:
其中 1 为升序排列,而 -1 是用于降序排列 
-->
db.COLLECTION_NAME.find().sort({KEY:1})

注:skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()

3.4.8 MongoDB 索引

命令:

<!-- createIndex() 方法来创建索引,Key 值为你要创建的索引字段:1 为指定按升序创建索引,如果你想按降序来创建索引指定为 -1 -->
<!--
在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名;
createIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)
例:db.COLLECTION_NAME.createIndex({"title":1,"description":-1})
-->
db.COLLECTION_NAME.createIndex(keys, options)
3.4.9 MongoDB 聚合

aggregate() 方法
命令:

<!-- MongoDB 中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似 SQL 语句中的 count(*) -->
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
表达式描述实例
$sum计算总和db.mycol.aggregate([{$ group : {_id : “$ by_user”, num_tutorial : {$sum : “$likes”}}}])
$avg计算平均值db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}])
$min获取集合中所有文档对应值得最小值db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}])
$max获取集合中所有文档对应值得最大值db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}])
$push在结果文档中插入值到一个数组中db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$push: “$url”}}}])
$addToSet在结果文档中插入值到一个数组中,但不创建副本db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$addToSet : “$url”}}}])
$first根据资源文档的排序获取第一个文档数据db.mycol.aggregate([{$group : {_id : “$by_user”, first_url : {$first : “$url”}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{$group : {_id : “$by_user”, last_url : {$last : “$url”}}}])

3.5 管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

聚合框架中常用的几个操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。
    例:
<!-- 1、$project实例 -->
db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );
<!-- 这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样: -->
db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

<!-- 2.$match实例 -->
<!-- $match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。-->
db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );


<!-- 3.$skip实例 -->
<!-- 经过$skip管道操作符处理后,前五个文档被"过滤"掉。 -->
db.article.aggregate(
    { $skip : 5 });

注:当 match 条件和 group 同时存在时,顺序会影响检索结果,必须先写 match 在前面。

4 时间关键字

  • $dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
  • $dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
  • $dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
  • $year: 返回该日期的年份部分。
  • $month: 返回该日期的月份部分( 1 到 12)。
  • $week: 返回该日期是所在年的第几个星期( 0 到 53)。
  • $hour: 返回该日期的小时部分。
  • $minute: 返回该日期的分钟部分。
  • $second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
  • $millisecond:返回该日期的毫秒部分( 0 到 999)。
  • $dateToString: { $dateToString: { format: , date: } }。

转载于菜鸟教程,对简单操作做个总结使用

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值