MongoDB数据库的基本操作

MongoDB数据库的基本操作

在操作MongoDB数据库时,首先需要打开MongoDB服务。如:

  • 开启MongoDB服务
net start MongoDB   # MongoDB 是在上一章的配置环境中通过 --serviceName "MongoDB"配置的。
  • 关闭MongoDB服务
net stop MongoDB    

MongoDB数据库相关操作
  • 连接数据库

当我们开始MongoDB服务后,需要开始连接MongoDB。连接的命令格式如下:

mongo 远程主机ip或DNS:MongoDB端口号/数据库名 -u 用户名 -p 密码

eg:

mongo   # 默认连接 mongodb://127.0.0.1:27017


// 指定ip端口和数据库名称
mongo 127.0.0.1:27017/test


// 指定ip,端口,数据库名称,用户名,密码
mongo 127.0.0.1:27017/test -u root -p root

image

  • 创建数据库

创建数据库的命令格式:

use database_name

如果数据库不存在,则创建,如果存在,则使用该数据库。

eg:

> use my    # 创建或使用my数据库
switched to db my   # 切换到my数据库

> db        # 查看当前数据库名称
my          # 当前使用的是my数据库

image

  • 查看数据库

    • show dbs: 查看所有数据库

      在命令行中输入:show dbs
      显示:

      admin
      local
      test
    • db:查看当前数据库

  • 删除数据库

    drop database_name:删除数据库

    eg:

    > use my
    switched to db my
    > db.dropDatabase()     #删除数据库
    { "ok" : 1 }
    

    image


Collection相关操作
  • 创建Collection

MongoDB的创建集合可以通过db.createCollection(name,options)的方法来创建。

name:指的是Collection(集合)的名称。

options:是一个文档,用于指定集合的配置,是一个可选参数。

    options参数:

    capped:Boolean类型,(可选参数)如果为true,则启用封闭的集合。上限集合是固定大小的集合,它在达到其最大大小时自动覆盖最旧的条目。如果为true,需要指定size参数。

    autoIndexId:Boolean类型,(可选参数)如果为true,则在_id字段上自动创建索引。默认值为false。

    size:数字类型,(可选参数)指定上限集合的最大大小(以字节为单位)。如果capped为true,那么还需要指定此字段的值。

    max:数字类型,(可选参数)指定上限集合中允许的最大文档数。
  1. 创建Collection方式一

    • 不带有options参数的创建:

      > use my
      switched to db my
      
      > db.createCollection('tb_my')  # 创建一个名为tb_my的集合
      {"ok":1}    # 表示创建成功
      
      > db.getCollection("tb_my").insert({"name":"amy","age":12})    # 向集合中插入一条数据
      WriteResult({"nInserted":1}     # 插入数据成功
    • 有options参数的创建:

      > db.createCollection('tb_my2',{capped:true,autoIndexId:true,size:6142800,max:10000})
      
      {
          "note" : "the autoIndexId option is deprecated and will be removed in a future release",
          "ok" : 1
      }   # autoIndexId在以后版本会移除
  2. 创建Collection方式二

    > use my
    switched to db my
    
    > db.abc    # 创建abc集合
    my.abc      # 创建成功
    
    > db.abc.insert({'name':'zhangfei','age':24})  # 插入数据
    WriteResult({"nInserted":1})    # 插入成功
    
    > show collections
    abc 
    tb_my
    tb_my2
    • 删除Collection
    db.collection_name.drop()   # 删除collection_name集合
    eg:
    
    > show collections
            abc
            tb_my
            tb_my2
    
            > db.abc.drop()     # 删除abc集合
            true                # 删除成功
    
            >show collections
            tb_my
            tb_my2

增删改查操作
  • 插入文档操作

    要将数据插入MongoDB集合中,需要使用MongoDB的insert()save()方法。

    • insert插入的基本格式

      db.collection_name.insert(document)
      
      db.getCollection('collection_name').insert(documrnt)

      eg:

      > db.tb_my.insert({"name":"zhangsan","age":14})
      
      > db.tb_my.insert([
          {"name":"zhang1","age":12},
          {"name":"zhang2","age":13},
          {"name":"zhang3","age":14}
      ])
      
      > db.tb_my.insert({
          "class_id":101
          "students":[
              {"id":1,"name":"student1"},
              {"id":2,"name":"student2"},
              {"id":3,"name":"student3"}
          ]
      })
    • insert()save()方法的异同

      不同点:
      
          如果新增的数据中存在主键,insert()会提示错误,而save()则更改原来的内容为新内容。
      
          如:
          已存在数据:{_id:1,"name":"n1"},再次进行插入操作时,
          insert({_id:1,"name":"n2"})    会报主键重复的错误提示
          save({_id:1,"name":"n2"})     会把n1修改为n2。
      
      
      相同点:
      
          如果新增的数据中没有主键时,会增加一条记录。
      
          如:
          已存在数据:{_id:1,"name":"n1"},再次进行插入操作时,
          insert({"name":"n2"})    插入的数据因为没有主键,所以会增加一条数据
          save({"name":"n2"})      增加一条数据
    • insertOne()

      insertOne()方法将单个文档插入到集合中。以下示例将新文档插入到库存集合中。 如果文档没有指定_id字段,MongoDB会自动将_id字段与ObjectId值添加到新文档。

      > db.tb_my.insertOne({"name":"amy","age":18})
      {
          "acknowledged" : true,
          "insertedId" : ObjectId("59eefc2e1af3a3e93a93376d")
      }   
    • insertMany()

      insertMany()方法将多个文档插入到集合中,可将一系列文档传递insertMany()方法。

      > db.tb_my.insertMany([
          {"name":"abc","age":18},
          {"name":"dfg","age":20},
          {"name":"opq","age":21}
        ])
      
      {
          "acknowledged" : true,
          "insertedIds" : [
                  ObjectId("59eefd721af3a3e93a93376e"),
                  ObjectId("59eefd721af3a3e93a93376f"),
                  ObjectId("59eefd721af3a3e93a933770")
          ]
      }
  • 更新文档操作

    MongoDB的update()save()方法用于将集合中的文档更新。update()更新的是一个文档document中的值,save()是更新的是一个文档document。

    • update()方法

      格式:

      db.collection_name.update(
          <query>,
          <update>,
          {
              upsert: <boolean>,
              multi: <boolean>,
              writeConcern:<document>
          }
      )
      
      query:update的查询条件,类似sql update查询的where后面的条件
      
      updateupdate的对象和一些更新的操作符(如:$type)等。
      
      upsert:可选参数,这个参数表示:如果不存在update的记录,是否插入objNew , true表示插入,默认是false,不插入。
      
      multi:可选参数,mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
      
      writeConcern:可选参数,抛出异常级别。

      eg:

      
      # 先插入多条数据
      
      db.tb_students.insertMany([
          {"student_id":1,"name":"liubei","age":12},
          {"student_id":2,"name":"guanyu","age":12},
          {"student_id":3,"name":"zhangfei","age":11}
      ])
      
      
      
      # 更新数据
      
      db.tb_students.update({"name":"zhangfei"},{$set:{"age":12}})
      
      结果:
      WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
      
      
      
      # 查询数据
      
      db.tb_students.find({"age":12},{"student_id":1,"name":1,"age":1})
      
      结果:
      { "_id" : ObjectId("59ef2342171ca131bee31775"), "student_id" : 1, "name" : "liubei", "age" : 12 }
      { "_id" : ObjectId("59ef2342171ca131bee31776"), "student_id" : 2, "name" : "guanyu", "age" : 12 }
      { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 12 }
      
      • multi参数使用的差别:

        eg:

        
        # 更新数据(不使用multi参数)
        
        db.tb_students.update({"age":12},{$set:{"age":13}})
        
        结果:
        WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })  # 不使用mutil参数,只更新第一次找到的一条数据
        
        
        #查询数据
        
        db.tb_students.find({"age":12},{"student_id":1,"name":1,"age":1})
        
        结果:
        { "_id" : ObjectId("59ef2342171ca131bee31776"), "student_id" : 2, "name" : "guanyu", "age" : 12 }
        { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 12 }
        
        
        
        # 更新数据(使用multi参数,设置为true)
        
        db.tb_students.update({"age":12},{$set:{"age":13}},{"multi":true})
        
        结果:
        WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })   # 更新多条数据
        
        
        # 查询数据
        
        db.tb_students.find({"age":13},{"student_id":1,"name":1,"age":1})
        
        { "_id" : ObjectId("59ef2342171ca131bee31775"), "student_id" : 1, "name" : "liubei", "age" : 13 }
        { "_id" : ObjectId("59ef2342171ca131bee31776"), "student_id" : 2, "name" : "guanyu", "age" : 13 }
        { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 13 }
    • save()

      
      
      # 查询所有数据
      
      db.tb_students.find({})
      
      结果:
      { "_id" : ObjectId("59ef2342171ca131bee31775"), "student_id" : 1, "name" : "liubei", "age" : 13 }
      { "_id" : ObjectId("59ef2342171ca131bee31776"), "student_id" : 2, "name" : "guanyu", "age" : 13 }
      { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 13 }
      
      
      
      # 更新数据
      
      db.tb_students.save({"_id":ObjectId('59ef2342171ca131bee31775'),"name":"abc"})
      
      
      # 查询更新后的数据
      
      db.tb_students.find({})
      
      结果:
      { "_id" : ObjectId("59ef2342171ca131bee31775"), "name":"abc" }  # 新数据覆盖旧数据
      { "_id" : ObjectId("59ef2342171ca131bee31776"), "student_id" : 2, "name" : "guanyu", "age" : 13 }
      { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 13 }
      
  • 删除文档操作

    MongoDB采用remove()来删除文档。

    格式:

    db.collection_name.remove(
        <query>,
        {
            justOne:<boolean>,
            writeConcern:<document>
        }
    )
    
    
    query:可选参数,删除文档的条件
    
    justOne:可选参数,如果设为true1,则只能删除一个文档
    
    writeConcern:可选参数,抛出异常的级别
    

    eg:这个案例还在tb_students集合中操作

    
    # 查询更新后的数据
    
    db.tb_students.find({})
    
    结果:
    { "_id" : ObjectId("59ef2342171ca131bee31775"), "name":"abc" }  
    { "_id" : ObjectId("59ef2342171ca131bee31776"), "student_id" : 2, "name" : "guanyu", "age" : 13 }
    { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 13 }
    
    
    
    # 删除数据
    
    db.tb_students.remove({"name":"abc"})
    
    结果:
    WriteResult({ "nRemoved" : 1 })  
    
    • justOne参数使用的差别

      
      # 不使用justOne参数
      
      db.tb_students.remove({"age":"13"})
      
      结果:
      WriteResult({"nRemoved":2}) # 删除了2个文档数据
      
      
      
      
      # 使用justOne参数
      
      db.tb_students.remove({"age":13},{"justOne":true})
      
      结果:
      WriteResult({"nRemoved":1}) # 删除了1个文档数据
      
    • 删除所有数据

      db.collection.remove({})    # 删除所有数据
      或
      db.collection.reomve()
      
  • 查询文档操作

    MongoDB查询文档使用find()方法

    格式:

    db.collection_name.find(query, projection)
    
    
    query:可选参数,使用查询操作符指定查询条件。
    
    projection:可选参数,使用投影操作符指定返回键。查询时返回文档中所有键值,只需要省略该参数即可(默认省略)。
    

    如果需要以易读的方式来读取数据,可以使用pretty()方法,语法格式如下:

    db.collection_name.pretty()

    pretty()方法以格式化方式来显示所有文档。

    eg:

    
    # 查询
    
    db.tb_students.find({})
    
    显示结果:
    { "_id" : ObjectId("59ef2342171ca131bee31777"), "student_id" : 3, "name" : "zhangfei", "age" : 13 }
    
    
    
    
    # 通过pretty()查询显示
    
    db.tb_students.find({}).pretty()
    
    显示结果:
    {
        "_id" : ObjectId("59ef2342171ca131bee31777"),
        "student_id" : 3,
        "name" : "zhangfei",
        "age" : 13
    }
    

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

    MongoDB的where语句

    操作格式
    等于{:}
    小于{:{$lt:}}
    小于或等于{:{$lte:}}
    大于{:{$gt:}}
    大于或等于{:{$gte:}}
    不等于{:{$ne:}}

    eg:

    
    
    # 插入一些数据
    
    db.tb_user.insertMany(
        [
            {'user_id':1,'username':'zhang1','password':123456},
            {'user_id':2,'username':'zhang2','password':1234567},
            {'user_id':3,'username':'zhang3','password':12345678},
            {'user_id':4,'username':'zhang4','password':123456789},
            {'user_id':5,'username':'zhang5','password':123789},
            {'user_id':6,'username':'zhang6','password':123456},
            {'user_id':7,'username':'zhang7','password':112233},
            {'user_id':8,'username':'zhang8','password':445566},
            {'user_id':9,'username':'zhang9','password':778899},
            {'user_id':10,'username':'zhang10','password':11223344},
            {'user_id':11,'username':'zhang11','password':123321},
        ]
    )
    
    
    
    # where 等于
    
    
    db.tb_user.find({'user_id':1})  # 查询user_id为1的文档
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    
    
    
    db.tb_user.find({'user_id':1},{'username':1,'password':1})  # 输出结果只有username,password字段
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "username" : "zhang1", "password" : 123456 }
    
    
    
    
    # 小于
    
    
    db.tb_user.find({'user_id':{$lt:3}})    # 查询user_id小于3的文档
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "user_id" : 2, "username" : "zhang2", "password" : 1234567 }
    
    
    
    
    # 小于或等于
    
    
    db.tb_user.find({'user_id':{$lte:3}},{'username':1,'password':1})
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "username" : "zhang2", "password" : 1234567 }
    { "_id" : ObjectId("59f00799102c502932b3c4ce"), "username" : "zhang3", "password" : 12345678 }
    
    
    
    
    # 大于
    
    
    db.tb_user.find({'user_id':{$gt:10}},{'username':1,'password':1})
    
    结果:
    { "_id" : ObjectId("59f00799102c502932b3c4d6"), "username" : "zhang11", "password" : 123321 }
    
    
    
    
    # 大于或等于
    
    
    db.tb_user.find({'user_id':{$gte:10}},{'username':1,'password':1})
    
    结果:
    { "_id" : ObjectId("59f00799102c502932b3c4d5"), "username" : "zhang10", "password" : 11223344 }
    { "_id" : ObjectId("59f00799102c502932b3c4d6"), "username" : "zhang11", "password" : 123321 }
    
    
    
    # 不等于
    
    db.tb_user.find({'user_id':{$ne:10}},{'username':1,'password':1})
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "username" : "zhang2", "password" : 1234567 }
    { "_id" : ObjectId("59f00799102c502932b3c4ce"), "username" : "zhang3", "password" : 12345678 }
    { "_id" : ObjectId("59f00799102c502932b3c4cf"), "username" : "zhang4", "password" : 123456789 }
    { "_id" : ObjectId("59f00799102c502932b3c4d0"), "username" : "zhang5", "password" : 123789 }
    { "_id" : ObjectId("59f00799102c502932b3c4d1"), "username" : "zhang6", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4d2"), "username" : "zhang7", "password" : 112233 }
    { "_id" : ObjectId("59f00799102c502932b3c4d3"), "username" : "zhang8", "password" : 445566 }
    { "_id" : ObjectId("59f00799102c502932b3c4d4"), "username" : "zhang9", "password" : 778899 }
    { "_id" : ObjectId("59f00799102c502932b3c4d6"), "username" : "zhang11", "password" : 123321 }

    MongoDB and条件

    格式:

    db.collection.find({key1:value1 , key2:value2}).pretty()

    eg:(使用tb_user的collection的数据)

    db.tb_user.find({'user_id':1,'password':123456})    # 查询user_id为1,password为123456的数据
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    
    
    
    db.tb_user.find({'user_id':{$ne:1},'password':123456})  # 查询user_id不为1,password为123456的数据
    
    结果:
    { "_id" : ObjectId("59f00799102c502932b3c4d1"), "user_id" : 6, "username" : "zhang6", "password" : 123456 }

    MongoDB or条件

    mongodb的or条件语句使用$or,语法如下:

    db.collection.find(
        {
            $or:[
                {key1:value1},
                {key2:value2}
            ]
        }
    ).pretty()

    eg:(使用tb_user的collection的数据)

    
    # 查询user_id为2,username为zhang4,password为123456的文档数据
    
    db.tb_user.find({$or:[{'user_id':2},{'username':'zhang4'},{'password':123456}]})
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "user_id" : 2, "username" : "zhang2", "password" : 1234567 }
    { "_id" : ObjectId("59f00799102c502932b3c4cf"), "user_id" : 4, "username" : "zhang4", "password" : 123456789 }
    { "_id" : ObjectId("59f00799102c502932b3c4d1"), "user_id" : 6, "username" : "zhang6", "password" : 123456 }
    

    and 和 or联合使用

    eg:(使用tb_user的collection的数据)

    
    # 查询password小于1234567,且user_id小于7或大于等于10的文档数据
    
    
    db.tb_user.find({'password':{$lte:1234567},$or:[{'user_id':{$lt:7}},{'user_id':{$gte:10}}]})
    
    
    结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "user_id" : 2, "username" : "zhang2", "password" : 1234567 }
    { "_id" : ObjectId("59f00799102c502932b3c4d0"), "user_id" : 5, "username" : "zhang5", "password" : 123789 }
    { "_id" : ObjectId("59f00799102c502932b3c4d1"), "user_id" : 6, "username" : "zhang6", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4d6"), "user_id" : 11, "username" : "zhang11", "password" : 123321 }
    

limit方法和skip方法
  • limit()方法

    如果你需要在MongoDB中读取指定数量的数据记录,可以使用limit(),limit()接收一个数字参数,限定查询的条数。

    格式:

    db.collection.find().limit(number)

    eg:

    
    # 查询tb_user集合
    
    db.tb_user.find()
    
    tb_user集合数据结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "user_id" : 2, "username" : "zhang2", "password" : 1234567 }
    { "_id" : ObjectId("59f00799102c502932b3c4ce"), "user_id" : 3, "username" : "zhang3", "password" : 12345678 }
    { "_id" : ObjectId("59f00799102c502932b3c4cf"), "user_id" : 4, "username" : "zhang4", "password" : 123456789 }
    { "_id" : ObjectId("59f00799102c502932b3c4d0"), "user_id" : 5, "username" : "zhang5", "password" : 123789 }
    { "_id" : ObjectId("59f00799102c502932b3c4d1"), "user_id" : 6, "username" : "zhang6", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4d2"), "user_id" : 7, "username" : "zhang7", "password" : 112233 }
    { "_id" : ObjectId("59f00799102c502932b3c4d3"), "user_id" : 8, "username" : "zhang8", "password" : 445566 }
    { "_id" : ObjectId("59f00799102c502932b3c4d4"), "user_id" : 9, "username" : "zhang9", "password" : 778899 }
    { "_id" : ObjectId("59f00799102c502932b3c4d5"), "user_id" : 10, "username" : "zhang10", "password" : 11223344 }
    { "_id" : ObjectId("59f00799102c502932b3c4d6"), "user_id" : 11, "username" : "zhang11", "password" : 123321 }
    
    
    
    
    # 使用limit()来显示查询的文档数据
    
    
    db.tb_user.find().limit(3)
    
    查询结果:
    { "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }
    { "_id" : ObjectId("59f00799102c502932b3c4cd"), "user_id" : 2, "username" : "zhang2", "password" : 1234567 }
    { "_id" : ObjectId("59f00799102c502932b3c4ce"), "user_id" : 3, "username" : "zhang3", "password" : 12345678 }
  • skip()方法

    skip()方法是:跳过指定数量的数据,skip()也是接收一个数字参数,默认为0。

    eg: (在tb_user集合数据下测试)

    “`
    db.tb_user.find().limit(3).skip(2) # 查询3条数据,跳过第1条和第2条

    结果:
    { “_id” : ObjectId(“59f00799102c502932b3c4ce”), “user_id” : 3, “username” : “zhang3”, “password” : 12345678 }
    { “_id” : ObjectId(“59f00799102c502932b3c4cf”), “user_id” : 4, “username” : “zhang4”, “password” : 123456789 }
    { “_id” : ObjectId(“59f00799102c502932b3c4d0”), “user_id” : 5, “username” : “zhang5”, “password” : 123789 }

“`

排序、索引
  • 排序

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

语法:

db.collection.find().sort({key:1})

eg:(在tb_user集合数据下测试)

# 升序:
db.tb_user.find().limit(3).sort({'password':1})

结果:
{ "_id" : ObjectId("59f00799102c502932b3c4d2"), "user_id" : 7, "username" : "zhang7", "password" : 112233 }
{ "_id" : ObjectId("59f00799102c502932b3c4d6"), "user_id" : 11, "username" : "zhang11", "password" : 123321 }
{ "_id" : ObjectId("59f00600b05fe4a9d949ef07"), "user_id" : 1, "username" : "zhang1", "password" : 123456 }



# 降序
db.tb_user.find().limit(3).sort({'password':-1})

结果:
{ "_id" : ObjectId("59f00799102c502932b3c4cf"), "user_id" : 4, "username" : "zhang4", "password" : 123456789 }
{ "_id" : ObjectId("59f00799102c502932b3c4ce"), "user_id" : 3, "username" : "zhang3", "password" : 12345678 }
{ "_id" : ObjectId("59f00799102c502932b3c4d5"), "user_id" : 10, "username" : "zhang10", "password" : 11223344 }
  • 索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

索引使用ensureIndex()方法表示

格式:

db.collection.ensureIndex({key:1/-1})

如果设置的key为1,表示升序,-1表示降序

ensureIndex() 接收可选参数,可选参数列表如下:

image


聚合

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

语法格式:

db.collection.aggregate(AGGREGATE_OPERATION)

计算结果的表达式:

image

管道概念:

在UNIX命令中,shell管道可以对某些输入执行操作,并将输出用作下一个命令的输入。

MongoDB也在聚合框架中支持类似的概念。每一组输出可作为另一组文档的输入,并生成一组生成的文档(或最终生成的JSON文档在管道的末尾)。这样就可以再次用于下一阶段等等。

  • $project:用于从集合中选择一些特定字段。
  • $match:这是一个过滤操作,因此可以减少作为下一个阶段输入的文档数量。
  • $group:这是上面讨论的实际聚合
  • $sort:排序文档
  • $skip:通过这种方式,可以在给定数量的文档的文档列表中向前跳过。
  • $#limit:限制从当前位置开始的给定数量的文档数量。
  • $unwind:用于展开正在使用数组的文档。

eg:

# 查询tb_pay集合中的所有数据

db.tb_pay.find()

结果:
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e3"), "pay_id" : 1, "name" : "dong", "money" : 2000 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e4"), "pad_id" : 2, "name" : "xi", "money" : 1800 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e5"), "pad_id" : 3, "name" : "nan", "money" : 1600 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e6"), "pad_id" : 4, "name" : "bei", "money" : 1900 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e7"), "pay_id" : 5, "name" : "dong", "money" : 2200 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e8"), "pad_id" : 6, "name" : "xi", "money" : 1700 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62e9"), "pad_id" : 7, "name" : "nan", "money" : 1500 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62ea"), "pad_id" : 8, "name" : "bei", "money" : 1900 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62eb"), "pay_id" : 9, "name" : "dong", "money" : 1700 }
{ "_id" : ObjectId("59f05625b6ecafa2f8ee62ec"), "pad_id" : 10, "name" : "xi", "money" : 1800 }




# 计算每个name支付多少次count
db.tb_pay.aggregate({$group:{'_id':'$name','count':{$sum : 1}}})

结果:
{ "_id" : "bei", "count" : 2 }
{ "_id" : "nan", "count" : 2 }
{ "_id" : "xi", "count" : 3 }
{ "_id" : "dong", "count" : 3 }



# 计算每个人,支付了多少money
db.tb_pay.aggregate({$group: { _id: '$name', nums: { $sum: '$money'} } })


结果:
{ "_id" : "bei", "count" : 3800 }
{ "_id" : "nan", "count" : 3100 }
{ "_id" : "xi", "count" : 5300 }
{ "_id" : "dong", "count" : 5900 }



# 计算bei,支付了多少钱
db.tb_pay.aggregate(
    [
        {$match:{'name':'bei'}}, 
        {$group: { _id: '$name', nums: { $sum: '$money'}}}
    ]
)

结果:
{ "_id" : "bei", "count" : 3800 }


# 计算nan支付的平均值
db.tb_pay.aggregate(
    [
        {$match : {'name':'nan'}},
        {$group : {'_id':'$name' , avg : {$avg : '$money'}}}
    ]
)

结果:
{ "_id" : "nan", "avg" : 1550 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值