MongoDb常见脚本-find,aggregate,update,insert,remove

-- MongoDb常见语法与示例-find,aggregate,update,insert,remove
【官网】:https://www.mongodb.com

应用场景

MongoDB 作为基于分布式文件存储的非关系型数据库。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案,这是非关系数据库当中功能最丰富,使用习惯最像关系数据库的一种。

基础资源

使用须知

【适用场景】 1. 实时的CRU操作,如网站、论坛等实时数据存储 2. 高伸缩性,可以分布式集群,动态增删节点 3. 存储大尺寸、低价值数据 4. 缓存 5. BSON结构对象存储 【不适用场景】 1. 高度事务性操作,如银行或会计系统 2. 传统商业智能应用,如提供高度优化的查询方式 3. 需要SQL的问题 4. 重要数据,关系型数据

配置步骤

[附1:MongoDb中查询的操作符]

操作符 格式 实例 与 关系数据库where 类比
等于(=) {<key> : {<value>}} db.test.find( {price : 24} ) where price = 24
大于(>) {<key> : {$gt : <value>}} db.test.find( {price : {$gt : 24}} ) where price > 24
小于(<) {<key> : {$lt : <value>}} db.test.find( {price : {$lt : 24}} ) where price < 24
大于等于(>=) {<key> : {$gte : <value>}} db.test.find( {price : {$gte : 24}} ) where price >= 24
小于等于(<=) {<key> : {$lte : <value>}} db.test.find( {price : {$lte : 24}} ) where price <= 24
不等于(!=) {<key> : {$ne : <value>}} db.test.find( {price : {$ne : 24}} ) where price != 24
与(and) {key01 : value01, key02 : value02, ...} db.test.find( {name : "config.net.cn", price : 24} ) where name = "config.net.cn" and price = 24
或(or) {$or : [{key01 : value01}, {key02 : value02}, ...]} db.test.find( {$or:[{name : "config.net.cn"},{price : 24}]} ) where name = "config.net.cn" or price = 24


【附2:aggregate的pipeline】


接受两个参数 pipeline/options, pipeline 是 array, 相同的 operator 可以多次使用

pipeline 支持的方法

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。
  • $geoNear:输出接近某一地理位置的有序文档。


$group 允许用的累加操作符 $addToSet/$avg/$first/$last/$max/$min/$push/$sum,不被允许的累加操作符$each... ,默认最多可以用 100MB RAM, 增加allowDiskUse可以让$group操作更多的数据


常见问题

  • Mongo查询显示没有结果或阻塞
    【解决方案】集合中的成员属性值的类型不对
  • Mongo查询显示没有结果或阻塞
    【解决方案】集合中的成员属性名字出错(包括大小写的区别)

快速入门

A)如何在MongoDb的客户端执行一个查询脚本?.

  use BookStore
  db.Book.find({"_id":"0bd937c891bd3135e02"});


[注]执行脚本的客户端:  NoSQL Booster for MongoDB.

B)Find和aggregate的两种查询.

B1)find和aggregate的介绍.

<find的介绍>

MongoDB 中查询文档使用 find() 方法。find() 方法以非结构化的方式来显示所要查询的文档, 查询数据的语法格式如下:

--基本语法

db.collection.find(query, projection)

query 为可选项,设置查询操作符指定查询条件;projection 也为可选项,表示使用投影操作符指定返回的字段,如果忽略此选项则返回所有字段。

查询 test 集合中的所有文档时,为了使显示的结果更为直观,可使用 pretty() 方法以格式化的方式来显示所有文档,方法如下:

> db.test.find().pretty()

除了 find() 方法,还可使用 findOne() 方法,它只返回一个文档。



 <aggregate介绍>

MongoDB中聚合(aggregate)主要用于处理数据(诸如avg,sum,count,max,min等),并返回计算后的数据结果。有点类似sql语句中的 group  by之后的聚合函数操作(avg,sum,count等)。

--基本语法.

db.collection.aggregate([
{
    $match : {< query >},
}
{
    $group: {< fieldl >: < field2 >}
}
])


--原理

   MongoDB 的聚合框架就是将文档输入处理管道,在管道内完成对文档的操作,最终将文档转换为聚合结果。
最基本的管道阶段提供过滤器,其操作类似查询和文档转换,可以修改输出文档的形式。其他管道操作提供了按特定字段对文档进行分组和排序的工具,以及用于聚合数组内容(包括文档数组)的工具。
此外,在管道阶段还可以使用运算符来执行诸如计算平均值或连接字符串之类的任务。聚合管道可以在分片集合上运行。

B2)find和aggregate的示例.

<aggregate查询>

 示例1)

db.Book.aggregate( {
     "$match":{$or: [ { BookTypeId: 0 }, { BookTypeId: 1 } ], BookId: "20508" }
 },
 { $sort: { CreateDate: -1 } },
 { $limit: 5 }
 );

[注]这里只用了聚合查询中的match阶段,因此有查询的作用,错误使用会因为没走索引导致速度非常缓慢,因此对于非聚合查询建议尽量使用find查询


示例2)

db.Book.aggregate([{$group : {_id :"$by_author", countBook: {$sum : 1}} 

类似sql中的:   select by_author, count(*)  as countBook from book group by by_author.


示例3)复杂聚合查询。

     db.SigninLog.aggregate([
      //{‘$match‘: { RefId: { $eq: "10026687880" } }},
      {
          $group : {_id :"$RefId",
          SignInCount: {$sum:{"$cond":[{"$eq":["$SignType",1]},1,0]}},
          SignOutCount: {$sum:{"$cond":[{"$eq":["$SignType",2]},1,0]}}
          }
      },
      {‘$match‘: {$or:[
          {$and: [{"SignInCount" : 2}, {"SignOutCount" : 1}]},
          {$and: [{"SignInCount" : 3}, {"SignOutCount" : 1}]},
          {$and: [{"SignInCount" : 3}, {"SignOutCount" : 2}]}
          ]}
      }, 
      {‘$sort‘:{‘SignInCount‘:1}}
       ]
       ,{ allowDiskUse: true });


示例4)复杂聚合查询.



<find查询>
示例 1) 

db.Book.find(
      {BookTypeId:{$in:[0,1]}, BookId: "20508"}
      
      ).sort({CreateDate:-1}).limit(5);


示例2) 包含ObjectId的查询

db.BookAds.find({"_id": ObjectId("edd937c891bd313403")});   //之所以有一个 ObjectId,请注意查看MongoDb中相关属性的数据类型。如果为ObjectId类型则需要这么去写。


示例3)多个条件的and关系.

    db.ChatLog.find({"RefId":"9001018802","RefType":3,"CreateTime":{$gt: new Date(‘2023-04-03‘)}});

C)update相关操作.

--语法.

db.collection.update(
    <query>,
    <update>,
    {
        upsert,
        multi,
        writeConcern,
        collation
    }
)

--示例.

db.BookAds.update(

{"_id": ObjectId("6073eadeb9a86947f96bcf35")},

{"$set": {"UpdateUserId": "100817", "UpdateDate": new Date(2021, 9, 13, 20, 56, 54, 740000), "IsReaded": true}}

,false

,true);

说明:

D)Insert操作.

--语法.


db.collection.insert(
<document or array of documents>,
{
    writeConcern: <document>,    //可选字段
    ordered: <boolean>    //可选字段
    }
)
--示例.



 db.test.insert([
        {_id:1, BookName:"《配置那些事》", price:"20" },
        {_id:2, BookName:"《配置啦》", price: "30" },
        {_id:3, BookName:"《高可用架构》", price: "40" }
    ],
    {ordered:true});
[注]在设置 ordered:true 时,插入的数据是有序的,如果存在某条待插入文档和集合的某文档 _id 相同的情况,_id 相同的文档与后续文档都将不再插入 


E)Remove操作.

--语法.

db.collection.remove(
    <query>,
    {
        justOne: <boolean>, writeConcern: <document>
    }
)

[注]


  • query:必选项,是设置删除的文档的条件。
  • justOne:布尔型的可选项,默认为false,删除符合条件的所有文档,如果设为 true,则只删除一个文档。
  • writeConcem:可选项,设置抛出异常的级别


--示例.


db.test.remove(
    {
        BookId:{$gt:1000}
    }
)


参考资料