zoukankan      html  css  js  c++  java
  • MongoDB基本命令

    简单添加用户

    MongoDB shell version: 3.4.*  

    >use admin

    >db.createUser(

      {

        user: "root",

        pwd: "abc123",

        roles: [ { role: "root", db: "admin" } ]

      }

    )

    >use test

    >db.createUser(

      {

        user: "myTester",

        pwd: "xyz123",

        roles: [ { role: "readWrite", db: "test" },

              { role: "read", db: "reporting" } ]

      }

    )

    >use mydb

    >db.createUser(

      {

        user: "mydbuser",

        pwd: "xyz123",

        roles: [ { role: "readWrite", db: "mydb" },

              { role: "read", db: "test" } ]

      }

    )

    删除用户

    >use mydb

    >db.dropUser("mydbuser");

    启用认证参数,修改各节点配置文件

    auth=true

    关闭mongodb

    启动mongodb

    # /usr/local/mongodb/bin/mongo 192.168.1.103:27017/admin -u root -p abc123

    # /usr/local/mongodb/bin/mongo 192.168.1.103:27017/mydb -u mydbuser -p xyz123

    查看 :

    > use test

    > show users

    查看集合结构

    添加数据

    >use test

    >for(var i=1; i<=60000; i++) db.student.insert({age:i,name:"mary",addr:"bj",country:"China"})

    >use mydb

    >for(var i=1; i<=60000; i++) db.teacher.insert({age:i,name:"allen",addr:"sh",country:"China"})

    //指定用户名和密码连接到指定的MongoDB数据库

    mongo 10.10.165.90:27017/laxin -u laxin_user -p lx_rwx_2259

    mongo 10.10.48.95:27017/admin -u root -p xR3i4jUq-2-GzRr2

    db.currentOp(),db.currentOp(true)

    Mongodb 的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,你可以通过db.currentOp()获取当前正在执行的操作。

    连接数信息

    >db.serverStatus().connections

    查看数据库

    > db.stats()

    {

        "db" : "laxin",

        "collections" : 2,

        "views" : 0,

        "objects" : 539325,

        "avgObjSize" : 584.1954276178557,

        "dataSize" : 315071199,

        "storageSize" : 124866560,

        "numExtents" : 0,

        "indexes" : 2,

        "indexSize" : 12214272,

        "ok" : 1

    }

    storageSize真正存储的大小,就是data。用WiredTiger压缩后的

    indexSize索引的大小

    dataSize未被压缩的大小

    查看数据库表

    > db.mpsGroupon.stats()

    查看一个collection有多少记录

    > db.mpsGroupon.count();

    179476

    > db.mpsGrouponMember.count()

    359849

    查看一个collection大小

    > db.mpsGroupon.dataSize();

    72149352

    > db.mpsGrouponMember.dataSize()

    242921847

    查看所有参数值:

    > use admin

    > db.adminCommand({getParameter:"*"})

    查看数据文件和日志文件路径:

    > db.runCommand("getCmdLineOpts")

    数据库常用命令

    1)查看命令提示

    >db.help();

    2)切换/创建数据库

    >use mydb;  

    3)查询所有数据库

    >show dbs;

    4)删除当前使用数据库

    >db.dropDatabase();

    5)从指定主机上克隆数据库

    >db.cloneDatabase("192.168.199.9");

    6)从指定的机器上复制指定数据库数据到某个数据库

    >db.copyDatabase("mydb", "temp", "192.168.199.9");

    7)修复当前数据库

    >db.repairDatabase();

    8)查看当前使用的数据库

    >db.getName();

     或者

    >db;

    9)显示当前db状态

    >db.stats();

    10)当前db版本

    >db.version();

    11)查看当前db的链接机器地址

    >db.getMongo();

    12)查询之前的错误信息

    >db.getPrevError();

    13)清除错误记录

    >db.resetError();

     

    集合

    1)创建一个集合

    >db.createCollection("mycoll");

    2)显示当前数据库中的集合

    >show collections;

    3)使用集合

    >db.mycoll

    或者

    >db.getCollection("mycoll")

    4)查看集合命令帮助文档

    >db.mycoll.help();

    5)查询当前集合的数据条数

    >db.mycoll.count();

    6)查看集合数据大小

    >db.mycoll.dataSize();

    7)查看集合索引大小

    >db.mycoll.totalIndexSize();

    8)为集合分配的空间大小,包括未使用的空间

    >db.mycoll.storageSize();

    9)显示集合总大小,包括索引和数据的大小和分配空间的大小

    >db.mycoll.totalSize();

    db.mycoll.totalSize()=db.mycoll.storageSize()+db.mycoll.totalIndexSize()

    10)显示当前集合所在的db

    >db.mycoll.getDB();

    11)显示当前集合的状态

    >db.mycoll.stats();

    12)集合的分片版本信息

    >db.mycoll.getShardVersion();

    13)集合重命名

    >db.mycoll.renameCollection("users");

    或者

    >db.getCollection("mycoll").renameCollection("users");

    14)显示当前db所有集合的状态信息

    >db.printCollectionStats();

    15)删除当前集合

    >db.mycoll.drop();

     

    文档

    1)写入文档

    >db.user.insert({"name":"joe"});

    或者

    >db.user.save({"name":"joe"});

    2)查看文档

    >db.user.find();

    saveinsert的区别在于不仅有写入数据功能还具有更新数据功能

    MongoDB使用save()update()方法来更新集合中的文档

    3)更新文档

    >db.user.save({"_id" : ObjectId("579036a9de4344710224234d"), "myName" : "joe", "age" : 20})

    update()使用示例:

    >db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,{multi:true},WriteConcern.SAFE);

    >db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,true,WriteConcern.SAFE);

    >db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},true,WriteConcern.SAFE);

    >db.user.update({"myName" : "joe"},{$set:{"age" : 20,"company": "google"}},{multi:1});

    db.collection.update(

    查询条件,

    整个文档或者修改器,

    upsert:boolean,

    multi:boolean,

    writeConcern:异常信息等级

    )

    4)删除文档

    使用示例:

    >db.user.remove({"myName" : "joe"},1);

    >db.user.remove({"myName" : "joe"});

    5)更新文档并返回文档

    > db.user.insert({"name":"joe1","age":25});

    > db.user.insert({"name":"joe2","age":26});

    > db.user.insert({"name":"joe3","age":27});

    > db.user.insert({"name":"joe4","age":28});

    >db.user.findAndModify({

        query: {age: {$gte: 25}},

        sort: {age: -1},

        update: {$set: {name: 'a2'}, $inc: {age: 2}}

    });

    或者

    >db.runCommand({ findandmodify : "user",

        query: {age: {$gte: 25}},

        sort: {age: -1},

        update: {$set: {name: 'a2'}, $inc: {age: 2}}

    });

    db.COLLECTION_NAME.findAndModify({query:{},

    update:{},

    remove:true|false,

    new:true|false,

    sort:{},

    fields:{},

    upsert:true|false});

    query是查询选择器,与findOne的查询选择器相同

    update是要更新的值,不能与remove同时出现

    remove表示删除符合query条件的文档,不能与update同时出现

    newtrue:返回个性后的文档,false:返回个性前的,默认是false

    sort:排序条件,与sort函数的参数一致。

    fields:投影操作,与find*的第二个参数一致。

    upsert:updateupsert参数一样。

    6)删除文档并返回文档

    >db.user.findAndModify({

        query: {age: {$gte: 25}},

        sort: {age: -1},

        remove: true

    });

    或者

    >db.runCommand({ findandmodify : "user",

        query: {age: {$gte: 25}},

        sort: {age: -1},

        remove: true

    });

    7)查询满足条件的文档数量

    >db.user.count({$or: [{age: 14}, {age: 28}]});

    索引

    1)创建索引

    >db.user.ensureIndex({age: 1});

    >db.user.ensureIndex({myName: 1, age: -1});

    创建索引还可以搭配一些参数:

    >db.test.ensureIndex({"username":1},{"background":true})

    >db.test.ensureIndex({"userid":1},{"unique":true})

    >db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})  

    >db.test.ensureIndex({"userid":1},{"unique":true,"sparse":true})

    2)查询集合所有索引

    >db.user.getIndexes();

    3)查看集合总索引记录大小

    >db.user.totalIndexSize();

    4) 读取当前集合的所有index信息

    >db.user.reIndex();

    5) 删除指定索引

    >db.user.dropIndex("myName");

    6) 删除集合所有索引

    >db.user.dropIndexes();

     

    基本查询

    find简介

    >db.user.find();

    >db.user.find().pretty();

    括号中可以设置两个个参数,以逗号分隔识别

    >db.user.find({"myName":"joe"},{"age":1})

    游标

    >var cursor= db.user.find();

    >while(cursor.hasNext()){

    var temp=cursor.next()

    print(temp.myName);

    }

    游标还实现了迭代器接口,所以可以使用forEach

    >var cursor= db.user.find();

    >cursor.forEach(function(temp){

    print(temp.myName);

    });

    条件查询

    与操作

    >db.user.find({"myName":"joe","age":16})

    或操作$or

    >db.user.find({$or: [{age: 14}, {age: 28}]});

    大于$gt

    >db.user.find({age: {$gt: 20}})

    小于$lt

    >db.user.find({age: {$lt: 20}})

    大于等于$gte

    >db.user.find({age: {$gte: 20}})

    小于等于$lte

    >db.user.find({age: {$lte: 20}})

    类型查询$type

    使用方式如下:

    >db.user.find( { "myName" : { $type : 2 } } );

    >db.user.find( { "myName" : { $type : "string" } } );

    是否存在$exists

    >db.user.find({"age": {$exists: true}})

    取模$mod

    >db.user.find({"age": {$mod : [10, 0]}});

    不等于$ne

    >db.user.find({ "age" : { "$ne" : 23}})

    包含$in

    >db.user.find({ "myName" : { "$in" : [ "joe" , "ab"]}})

    不包含$nin

    >db.user.find({ "myName" : { "$nin" : [ "joe" , "ab"]}})

    $not: 反匹配

    以上所有字段查询操作都能取非,比如:

    >db.user.find({ "myName" : { "$in" : [ "joe" , "ab"]}})

    >db.user.find({ "myName" : {$not:{ "$in" : [ "joe" , "ab"]}}})

    特定类型查询

    null

    >db.user.find({"company":null})

    查询company字段为null的文档。

    >db.user.find({"company":{$nin:[null]} })

    查询company字段不为空的文档。

    MongoDB中的正则用法

    MongoDB使用//表示启用正则表达式,如下:

    >db.user.find({"name":/^j/})

    嵌套文档

    BSON格式的文档是可以相互嵌套的,例如如下文档phone字段的值就是一个子文档:

    {     

    "name" : "huangz",     

    "phone" : { "home" : 123321,     

             "mobile" :  15820123123}     

    }

    精确匹配查询

    指定完整的文档,查询出子文档完全匹配指定文档的文档。

    >db.user.find({"phone":{"home" : 123321,"mobile" :  15820123123}})

    点查询

    如果我们不知道子文档的完整文档,只知道子文档中一个字段的值,可以通过点查询。

    >db.user.find({"phone.home":123321})

    数组

    数组单元素查询

    > db.user.insert({"name":"allen1","age":25,"favorite":[6]});

    > db.user.insert({"name":"allen2","age":26,"favorite":[6,7]});

    > db.user.insert({"name":"allen3","age":27,"favorite":[6,7,8]});

    > db.user.insert({"name":"allen4","age":28,"favorite":[6,7,8,9]});

    >db.user.find({favorite:6});

    $all数组多元素查询

    >db.user.find({favorite : {$all : [6, 8]}});

    $size数组长度查询

    >db.user.find({favorite: {$size: 3}});

    返回数组子集

    >db.user.find({},{favorite: {$slice: 2}});

    >db.user.find({},{favorite: {$slice: -2}});

    精确匹配查询

    >db.user.find({favorite :[6, 7]});

    点查询

    点查询用于查询更复杂的数组,例如数组中包含的是子文档的情况:

    {     

      "name" : "joe",     

      "phone" :[ { "home" : 123321,     

                       "mobile" :  1854046352},

                 { "home" : 123652,     

                       "mobile" :  15820123123} ,

                 { "home" : 123456,     

                       "mobile" :  13820123123}

             ]

    }

    需要查询phone数组中子文档的home值为123456的文档,使用命令:

    >db.user.find({"phone.home":123456});

    索引查询

    数组都有索引,例如[6,8],6是第0个元素,8是第1个元素(数组索引以0开头)。要查找某个元素指定值的文档可以使用点和索引值:

    >db.user.find({"favorite_number.0":6});

    点查询中只要数组的子文档里有一个home值满足查询值就会返回文档。如果我们要精确到第几个元素也可以用索引查询。

    >db.user.find({"phone.2.home":123456});

     

    高级查询$where

    Javascript编程简单例子

    >db.user.find().forEach(function(item){  

        if(item.age>18){

           item.tag="adult";

        }  

        db.user.save(item);     

    })

    JavaScript$where结合使用

    >db.user.find({age: {$gt: 18}});

    或者

    >db.user.find({$where: "this.age > 18"});

    或者

    >db.user.find("this.age > 18");

    或者

    >f = function() {return this.age > 18}; db.user.find(f);

    查询辅助

    条数限制limit

    >db.user.find().limit(2);

    起始位置skip

    >db.user.find().skip(3).limit(5);

    排序sort

    >db.user.find().sort({age: 1});

    >db.user.find().sort({age: -1});

     

    修改器

    $set

    >db.user.update({"name":"joe"},{$set:{"age":18,"company":"google"}});

    $unset

    >db.user.update({"name":"joe"},{$unset:{"company":1}});

    $inc

    >db.user.update({"name":"joe"},{$inc: {age: 50}});

    $push

    >db.user.update({"name":"joe"},{$push: {phone: {"home":456789,"mobile":"13562352412"}}});

    $pushAll

    >db.user.update({"name":"joe"},{$pushAll: {phone: [{"home":456789,"mobile":"13562352412"},

    $pull

    >db.user.update({"name":"joe"},{$pull: {phone:{"home": 456789} }});

    $addToSet

    >db.user.update({"name":"joe"},{$addToSet: {phone: {"home":456789,"mobile":"13562352412"}}});

    $pop

    >db.user.update({"name":"joe"},{$pop: {phone:1}});

    $rename

    >db.user.update({"name":"joe"},{$rename: {"phone":"call"}});

     

    原生聚合运算

    数量查询count

    >db.user.count({age: {$gte: 18}})

    不同值distinct

    >db.runCommand({"distinct":"user", "key":"age"})

     

    聚合管道aggregate

    $match

    >db.user.aggregate([

                        {

                            $match:{"name.last":"joe"}       

                        }

    ])

    $limit

    >db.user.aggregate(

        { $limit : 1 }

    );

    $skip

    >db.user.aggregate({ $skip : 2 });

    $group

    把数据根据age字段进行分组,使用命令:

    >db.user.aggregate([{$group : {_id : "$age"}}])

    $lookup

    例子如下:

    创建产品信息:

    >db.product.insert({"_id":1,"name":"产品1","price":99})

    >db.product.insert({"_id":2,"name":"产品2","price":88})

    >db.order.insert({"_id":1,"pid":1,"name":"订单1"})

    >db.order.insert({"_id":2,"pid":2,"name":"订单2"})

    >db.order.insert({"_id":3,"pid":2,"name":"订单3"})

    >db.order.insert({"_id":4,"pid":1,"name":"订单4"})

    >db.order.insert({"_id":5,"name":"订单5"})

    >db.order.insert({"_id":6,"name":"订单6"})

    $lookup作左连接组合两个集合的信息使用命令如下:

    >db.order.aggregate([

          {

                $lookup:

               {

                from: "product",

                localField: "pid",

                foreignField: "_id",

                as: "orderDetail"

              }

        }

     ])

    管道表达式

    测试数据准备:

    >db.product.insert({"_id":1,"name":"产品1","price":99,"type":"服装"})

    >db.product.insert({"_id":2,"name":"产品2","price":88,"type":"服装"})

    >db.product.insert({"_id":3,"name":"产品3","price":29,"type":"饰品"})

    >db.product.insert({"_id":4,"name":"产品4","price":78,"type":"服装"})

    >db.product.insert({"_id":5,"name":"产品5","price":9,"type":"饰品"})

    >db.product.insert({"_id":6,"name":"产品6","price":18,"type":"饰品"})

    数据如下:

    > db.product.find()

    { "_id" : 1, "name" : "产品1", "price" : 99, "type" : "服装" }

    { "_id" : 2, "name" : "产品2", "price" : 88, "type" : "服装" }

    { "_id" : 3, "name" : "产品3", "price" : 29, "type" : "饰品" }

    { "_id" : 4, "name" : "产品4", "price" : 78, "type" : "服装" }

    { "_id" : 5, "name" : "产品5", "price" : 9, "type" : "饰品" }

    { "_id" : 6, "name" : "产品6", "price" : 18, "type" : "饰品" }

    1)求和$sum

    >db.product.aggregate([{$group : {_id : "$type", price : {$sum : "$price"}}}])

    2)平均值$avg

    >db.product.aggregate([{$group : {_id : "$type", price : {$avg : "$price"}}}])

    3)最小值$min

    >db.product.aggregate([{$group : {_id : "$type", price : {$min : "$price"}}}])

    4)最大值$max

    >db.product.aggregate([{$group : {_id : "$type", price : {$max : "$price"}}}])

    复合使用示例

    >db.user.aggregate([

          { $match: { age:{"$gt":13} } },

          { $sort: { age: 1 } },

          { $limit: 2 },

          { $group: { _id: "$age", "人数": { $sum: 1 } } },     

       ]

    )

  • 相关阅读:
    Java链栈
    Java链栈
    java实现顺序栈
    java实现顺序栈
    求两个数的最大公约数
    求两个数的最大公约数
    一张图瞬间让你明白原型链结构
    前端面试题
    javascript学习中自己对作用域和作用域链理解
    关于javascript中静态成员和实例成员的详细解释
  • 原文地址:https://www.cnblogs.com/allenhu320/p/11340031.html
Copyright © 2011-2022 走看看