MongoDB 相关操作命令。

Posted youngxuebo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB 相关操作命令。相关的知识,希望对你有一定的参考价值。

MongoDB 相关操作命令:

一、启动 MongoDB服务命令

./bin/mongod -config ./data/mongodb.conf

二、关闭 MongoDB服务命令

./bin/mongod -shutdown -config ./data/mongodb.conf

三、MongoDB 连接

mongodb://username:password@hostname/dbname

标准格式:
mongodb://username:password@host1:port1,host2:port2,…,hostN:portN/dbname/?option1;option2


四、数据库操作


4.1、创建数据库:use DATABASE_NAME

MongoDB通过命令use 数据库名创建数据库。如果数据库不存在,该命令将创建一个数据库,否则切换已有数据库。

4.2、 查看当前所在的数据库:db


4.3、展示所有数据库:show dbs


4.4、删除数据库:db.dropDatabase()

删除当前数据库

五、集合操作


5.1 创建集合: db.createCollection(name, options)

命令中,name是要创建的集合名称,options是一个文档,用于指定集合的配置。
----------------------------------------------------------
参数 类型 描述
Name String 要创建的集合名称
Options Document (可选)指定内存大小、索引等选项/td>

如详情

5.2 展示集合: show collections


5.3 删除集合: db.COLLECTION_NAME.drop()


六、文档操作


6.1 插入文档


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

命令:db.COLLECTION_NAME.insert(document)

例子:

> db.mycollection_table.insert(
   title: 'MongoDB入门', 
   description: 'MongoDB是开源的NoSQL数据库',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 888
)

要在一次查询中插入多个文档,可以在insert()命令中,传递一个文档数组。

> db.mycollection_table.insert([
   
      title: 'MongoDB入门', 
      description: 'MongoDB是一个以文档为中心的NOSQL数据库',
      tags: ['mongodb', 'database', 'NoSQL'],
      likes: 88
   ,

   
      title: 'MongoDB优势', 
      description: "MongoDB相对于RDBMS的优势",
      tags: ['mongodb', 'database', 'NoSQL'],
      comments: [   
         
            user:'user1',
            message: 'My first comment',
            dateCreated: new Date(2018,11,10,2,35),
            like: 0 
         
      ]
   
])

将数据定义为一个变量插入

> document=(title: 'MongoDB 教程', 
    description: 'MongoDB 是一个 Nosql 数据库',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
);

> db.mycollection_table.insert(document)
WriteResult( "nInserted" : 1 )
> 

要插入文档,还可以使用db.post.save(document)方法。如果没指定_id,那么save()方法将与insert()方法一样,自动生成_id。如果指定_id,则它将替换_id所标识文档的整个数据。

6.2 删除文档

remove() 方法

remove() 方法的基本语法格式如下所示:

db.mycollection_table.remove(
   <query>,
   <justOne>
)

#如果MongoDB 是 2.6 版本以后的,语法格式如下:
db.mycollection_table.remove(
   <query>,
   
     justOne: <boolean>,
     writeConcern: <document>
   
)

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern :(可选)抛出异常的级别。

举例:

#符合条件的全删除
>db.mycollection_table.remove('title':'MongoDB 教程')

#只想删除第一条找到的记录可以设置 justOne 为 1
>db.mycollection_table.remove(DELETION_CRITERIA,1)
>db.col.remove('title':'MongoDB 教程',1)

#删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令清空表)
>db.mycollection_table.remove()
>>db.mycollection_table.remove()

6.3 更新文档

(1)MongoDB数据更新可以使用update()函数。

db.mycollection_table.update( criteria, objNew, upsert, multi )

update()函数接受以下四个参数:

  • criteria : update的查询条件,类似sql update查询内where后面的。
  • objNew :update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
  • upsert :这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi :mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

举例:

#将title栏位的 MongoDB 优势,更新为 MongoDB 优点
> db.mycollection_table.update('title':'MongoDB 优势', $set:'title':'MongoDB 优点')

#默认情况下,MongoDB只更新一个文档。要更新多个文档,需要将参数“multi”设置为true。
db.mycollection_table.update('title':'MongoDB 入门', $set:'title':'MongoDB 概述',multi:true)

#只更新第一条记录:
db.test.update(  "count" :  $gt : 1   ,  $set :  "test2" : "OK"  ); 

#全部更新:
db.test.update(  "count" :  $gt : 3   ,  $set :  "test2" : "OK" ,false,true ); 

#只添加第一条:
db.test.update(  "count" :  $gt : 4   ,  $set :  "test5" : "OK" ,true,false ); 

#全部添加加进去:
db.test.update(  "count" :  $gt : 5   ,  $set :  "test5" : "OK" ,true,true ); 
 
#全部更新:
db.test.update(  "count" :  $gt : 15   ,  $inc :  "count" : 1 ,false,true );
 
#只更新第一条记录:
db.test.update(  "count" :  $gt : 10   ,  $inc :  "count" : 1 ,false,false );
  • $inc 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
  • $set 用来指定一个键并更新键值,若键不存在并创建。

(2)更新内嵌的文档

> db.test.findOne("name":"toyota")

  "_id" : ObjectId("5003be465af21ff428dafbe7"),
  "name" : "toyota",
  "type" : "suv",
  "size" : 
    "height" : 10,
    "width" : 5,
    "length" : 15
  


> db.test.update("name":"toyota","$set":"size.height":8)

> db.test.findOne("name":"toyota")

  "_id" : ObjectId("5003be465af21ff428dafbe7"),
  "name" : "toyota",
  "type" : "suv",
  "size" : 
    "height" : 8,
    "width" : 5,
    "length" : 15
  

(3)Save() 方法

save()方法根据文档参数更新现有文档或插入新文档。

#语法
db.COLLECTION_NAME.save(_id:ObjectId(), NEW_DATA)

#下面的示例,把新内容保存到_id为’5cf7b4839ad87fde6fd23a03’的文档中。

> db.mycollection_table.save(
   
      "_id" : ObjectId("5cf7b4839ad87fde6fd23a03"), "title":"MongoDB 介绍",
      "by":"qikegu.com"
   
)

6.4 查询文档


find() 方法

find()方法的基本语法如: db.COLLECTION_NAME.find()

除了find()方法之外,还有findOne()方法,它只返回一个结果。


pretty() 方法

要以格式化的方式显示结果,可以使用pretty()方法。

> db.mycollection_table.find().pretty()

#需要返回的键,0 为不返回,1为返回
> db.mycollection_table.find("key":"value","key":1).pretty()
#相当于sql:
select key from mycollection_table where key = 'value'

MongoDB查询条件与SQL Where对比

find()方法可以传入查询条件,为便于理解,下表列出了等价的SQL Where语句。

操作语法例子等价于
等于<key>:<value>db.mycol.find(“title”:”MongoDB教程”).pretty()where title = ‘MongoDB教程’
小于<key>:$lt:<value>db.mycol.find(“likes”:$lt:50).pretty()where likes < 50
小于等于<key>:$lte:<value>db.mycol.find(“likes”:$lte:50).pretty()where likes <= 50
大于<key>:$gt:<value>db.mycol.find(“likes”:$gt:50).pretty()where likes > 50
大于等于<key>:$gte:<value>db.mycol.find(“likes”:$gte:50).pretty()where likes >= 50
小于等于:$ne:<value>db.mycol.find(“likes”:$ne:50).pretty()where likes != 50

举例如下:

db.col.find("likes" : $gt : 100)
#类似于SQL语句:
Select * from mycollection_table where likes > 100;

db.col.find(likes : $lte : 150)
#类似于SQL语句:
Select * from col where likes <= 150;

db.mycollection_table.find(likes : $lt :200, $gt : 100)
#类似于SQL语句:
Select * from mycollection_table where likes>100 AND  likes<200;

(1) AND 条件语法

> db.mycollection_table.find(
   
      $and: [
         key1: value1, key2:value2
      ]
   
).pretty()

//and 可以省略
> db.mycollection_table.find(
   
    key1:value1, 
    key2:value2
   
).pretty()

(2) OR 条件语法

> db.mycollection_table.find(
   
      $or: [
         "key1": "value1", "key2":"value2"
      ]
   
).pretty()

(3) AND 和 OR混合

> db.mycollection_table.find(
   
      $and: [
         "key1": "value1", "key2":"value2"
      ],
      $or: [
         "key1": "value1", "key2":"value2"
      ]
   
).pretty()

(4)Limit 方法

limit()方法限定返回行数,基本语法如下所示:

>db.COLLECTION_NAME.find().limit(NUMBER)

#如查询mycollection_table集合,显示title列,不显示_id列,返回两行数据:
>db.mycollection_table.find(,"title":1,_id:0).limit(2)

(5) LIKE模糊查询

1、LIKE模糊查询userName包含A字母的数据(%A%)

#SQL:
SELECT * FROM UserInfo WHERE userName LIKE "%A%"

#MongoDB:
db.UserInfo.find("userName": /A/)

2、LIKE模糊查询userName以字母A开头的数据(A%)

#SQL:
SELECT * FROM UserInfo WHERE userName LIKE "A%"

#MongoDB:
db.UserInfo.find("userName":/^A/)

3、正则表达式查询 $regex

>db.posts.find(post_text:$regex:"runoob")

#以上查询也可以写为:
>db.posts.find(post_text:/runoob/)

#例子:
select * from member where name like '%XXX%'
#在mongodb中:
db.member.find("name": $regex:/XXX/)

#查询以某字段为开头的文档
db.member.find("name":$regex:/^XXX/)
#查询以某字段为结尾的文档
db.member.find("name":$regex:/XXX^/)
#查询忽略大小写
db.member.find("name":$regex:/XXX/i)
db.member.find(  name:  $regex: /XXX/, $options: 'i'   )

参考:mongodb中$regex的用法


(6)特定类型查询

参考:查询条件


6.5 排序

sort()方法

通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。

db.COLLECTION_NAME.find().sort(KEY:1)

七、其他操作


7.1 索引

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。

ensureIndex() 方法

MongoDB使用 ensureIndex() 方法来创建索引

#语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
>db.COLLECTION_NAME.ensureIndex(KEY:1)

#复合索引
>db.mycol.ensureIndex("title":1,"description":-1)

#在后台创建索引:
db.values.ensureIndex("title":1,"description":-1, background: true)

7.2 聚合

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

7.2.1 aggregate() 方法

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
#不包含_id
db.article.aggregate(
     $project : 
        _id : 0 ,
        title : 1 ,
        author : 1
    );

#相当于sql:
select title,author from article

mongoDB中聚合(aggregate)的具体使用

7.2.2 管道符

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

先来看一个分组的例子,本例中 $group 是一个管道操作符,获得的结果可以接着输出到下一个管道,而内部的$sum是一个表达式操作符。

db.article.aggregate([ 
        
            $group: 
                _id: '$time', 
                num: $sum: 1
            
        
    ])
#_id字段表示你要基于哪个字段来进行分组(即制定字段值相同的为一组)
#num字段的值$sum: 1表示的是获取满足time字段相同的这一组的数量乘以后面给定的值(本例为1,那么就是同组的数量)。
#类似sql: select time,count(*) from article group by time

看完上述例子之后,mongoDB中还有其他的一些管道操作符和表达式操作符:


mongo的聚合操作和mysql的查询做下类比:

SQL 操作/函数mongodb聚合操作
where$match
group by$group
having$match
select$project
order by$sort
limit$limit
sum()$sum
count()$sum
join$lookup (v3.2 新增)

实例:

下面举了一些常用的mongo聚合例子和sql的对比:

#以下表数据:

  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  status: 'A',
  price: 50,
  items: [  sku: "xxx", qty: 25, price: 1 ,
            sku: "yyy", qty: 25, price: 1  ]

1. 统计orders表decocument数量
db.orders.aggregate( [
   
     $group: 
        _id: null,
        count:  $sum: 1 
     
   
] )

类似sql:
SELECT COUNT(*) AS count FROM orders


2.对orders表计算所有price求和
db.orders.aggregate( [
   
     $group: 
        _id: null,
        total:  $sum: "$price" 
     
   
] )

类似sql;
SELECT SUM(price) AS total  FROM orders

3.对每一个唯一的cust_id, 计算price总和
db.orders.aggregate( [
   
     $group: 
        _id: "$cust_id",
        total:  $sum: "$price" 
     
   
] )

类似sql:
SELECT cust_id,
       SUM(price) AS total
  FROM orders
 GROUP BY cust_id

4.对每一个唯一对cust_id和ord_date分组,计算price总和,不包括日期的时间部分
db.orders.aggregate( [
   
     $group: 
        _id: 
           cust_id: "$cust_id",
           ord_date: 
               month:  $month: "$ord_date" ,
               day:  $dayOfMonth: "$ord_date" ,
               year:  $year: "$ord_date"
           
        ,
        total:  $sum: "$price" 
     
   
] )

类似sql:
SELECT cust_id,
       ord_date,
       SUM(price) AS total
FROM orders
GROUP BY cust_id,
         ord_date

5.对于有多个记录的cust_id,返回cust_id和对应的数量
db.orders.aggregate( [
   
     $group: 
        _id: "$cust_id",
        count:  $sum: 1 
     
   ,
    $match:  count:  $gt: 1   
] )

类似sql:
SELECT cust_id,
       count(*)
FROM orders
GROUP BY cust_id
HAVING count(*) > 1

6.对每个唯一的cust_id和ord_date分组,计算价格总和,并只返回price总和大于250的记录,且排除日期的时间部分
db.orders.aggregate( [
   
     $group: 
        _id: 
           cust_id: "$cust_id",
           ord_date: 
               month:  $month: "$ord_date" ,
               day:  $dayOfMonth: "$ord_date" ,
               year:  $year: "$ord_date"
           
        ,
        total:  $sum: "$price" 
     
   ,
    $match:  total:  $gt: 250   
] )

类似sql:
SELECT cust_id,
       ord_date,
       SUM(price) AS total
FROM orders
GROUP BY cust_id,
         ord_date
HAVING total > 250


7.对每个唯一的cust_id且status=A,计算price总和
db.orders.aggregate( [
    $match:  status: 'A'  ,
   
     $group: 
        _id: "$cust_id",
        total:  $sum: "$price" 
     
   
] )

类似sql:
SELECT cust_id,
       SUM(price) as total
FROM orders
WHERE status = 'A'
GROUP BY cust_id


8.对每个唯一的cust_id且status=A,计算price总和并且只返回price总和大于250的记录
db.orders.aggregate( [
    $match:  status: 'A'  ,
   
     $group: 
        _id: "$cust_id",
        total:  $sum: "$price" 
     
   ,
    $match:  total:  $gt: 250   
] )

类似sql:
SELECT cust_id,
       SUM(price) as total
FROM orders
WHERE status = 'A'
GROUP BY cust_id
HAVING total > 250


9.对于每个唯一的cust_id,将与orders相关联的相应订单项order_lineitem的qty字段进行总计
db.orders.aggregate( [
    $unwind: "$items" ,
   
     $group: 
        _id: "$cust_id",
        qty:  $sum: "$items.qty" 
     
   
] )

类似sql:
SELECT cust_id,
       SUM(li.qty) as qty
FROM orders o,
     order_lineitem li
WHERE li.order_id = o.id
GROUP BY cust_id


10.统计不同cust_id和ord_date分组的数量,排除日期的时间部分
db.orders.aggregate( [
   
     $group: 
        _id: 
           cust_id: "$cust_id",
           ord_date: 
               month:  $month: "$ord_date" ,
               day:  $dayOfMonth: "$ord_date" ,
               year:  $year: "$ord_date"
           
        
     
   ,
   
     $group: 
        _id: null,
        count:  $sum: 1 
     
   
] )

类似sql:
SELECT COUNT(*)
FROM (SELECT cust_id, ord_date
      FROM orders
      GROUP BY cust_id, ord_date)
      as DerivedTable

八、参考地址

参考1
参考2

以上是关于MongoDB 相关操作命令。的主要内容,如果未能解决你的问题,请参考以下文章

如何汇总 MongoDB 中的总和以获得总计数?

MongoDB相关方法

Mongodb 相关操作

MongoDb文档型数据库

nodejs学习-4:nodejs连接mongodb和相关操作

nodejs学习-4:nodejs连接mongodb和相关操作