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 } } },     

   ]

)

原文地址:https://www.cnblogs.com/allenhu320/p/11340031.html