MongoDB的语法和传统关系型数据库语法不同,它调用的是JavaScript提供的API接口。例如:
添加数据
单行数据插入(insert)
use appdb
db.book.insert({
title: 'my first book',
publishedData : new Date(),
tags: [
'MongoDB',
'nosql'
],
favCount: 25,
author: 'zale' ,
})
WriteResult({ "nInserted" : 1 }) 表示插入数据成功
由于MongoDB属于文档型数据库,它不像关系型数据库一样有着特定的格式,所以你可以在数据库中插入任意结构数据,但不推荐这样做;例如
db.book.insert({
title:'我的第一本书',
author:"liuliuliu",
icon: "这是书的封面",
utl:'http://book.zhouhc.test.com'
})
这时的数据库中:
表结构为:
无限制的插入,项目必然无法维护。
批量插入
批量插入用到的方法:
db.book.insertMany();
以下是例子:
db.book.insertMany([{
title:'批量插入',
author:'zhohc',
publishedData: new Date(),
tags:['mongo', '批量插入'],
favCount: 19
}, {
title:'批量插入',
author:'zhohc',
publishedData: new Date(),
tags:['mongo', '批量插入'],
favCount: 19
}])
该语句的执行结果如下:
当然也可以通过js脚本的方式批量插入数据, 如下:
这段js脚本会向MongoDB中插入20条数据.这里就不执行,想试的可以自己去弄。
查询文档(find)
查询全部数据
db.collection.find()方法可以用于集合数据的查询,代码如下:
db.book.find()
如果查询返回的条目数量比较多,Mongo shell则会自动实现分批查询,默认情况下每次显示20条数据,可以输入it命令读取下一批。
实际上,find命令返回的是一个游标(cursor)对象,Mongo shell对batchSize做了限制,该大小可以通过变量DBQuery.shellBatchSize修改。
使用游标对象提供的API,可以对全部结果集进行遍历,代码如下:
var cursor = db.book.find()
cursor.forEach(printjson)
执行结果如下:
指定条件查询
准备数据
db.aaa.insert({id: 1, user:'zhouhc1', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 2, user:'zhouhc2', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 3, user:'zhouhc3', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 4, user:'zhouhc4', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 5, user:'zhouhc5', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 6, user:'zhouhc6', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 7, user:'zhouhc7', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 8, user:'zhouhc8', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 9, user:'zhouhc9', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 10, user:'zhouhc10', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 11, user:'zhouhc11', pwd:'hello', icon: '图标'})
db.aaa.insert({id: 12, user:'zhouhc12', pwd:'hello', icon: '图标'})
几种常见的操作
MongoDB的比较操作符见下表
几种逻辑运算符
数组运算符
- 查询id为"1"的用户信息
db.aaa.find({id: 1})
- 查询用户ID大于5的用户信息
db.aaa.find({id: {$gt: 5}})
该语句执行结果如下:
- 排序,分页
- 查询用户ID大于5的用户信息,且按照id降序
该语句执行结果如下:db.aaa.find({id:{$gt: 5}}).sort({id: -1})
-
分页查询
分页查询主要有两个参数- skip: 用于指定跳过记录数
- limit: 用于限定返回结果数
例如:
查询id>5的用户,且按照每页2条数据进行分页,取第二页db.aaa.find({id: {$gt: 5}}).skip(2).limit(2)
更新文档(update)
更新操作符
基本语法格式
MongoDB中可以用update命令对指定的数据进行更新,命令的格式如下:
db.{collection}.update(query, update, options)
参数说明:
- query: 描述更新的查询条件
- update: 描述更新的动作以及新的内容
- options: 描述更新的选项
- 更新单条数据
例如: 将id = 1的用户,用户名修改为liuliuliu,
db.aaa.update({id: 1},{$set: {user: 'liuliuliu'}})
该语句执行结果如下:
通过查询,可以看到id=1的数据user已经更新了
默认情况下,update命令在更新第一个文档之后返回。(也就是说,默认情况下update命令只更新一个文档),如果需要更新多条数据,如下
- 更新多条数据
更新多条数据用到Options参数multi
参数介绍
- multi: 是否更新多条数据,默认false
基础语法如下:
db.aaa.update(
{id: {$gt : 10}},
{$set: {user: 'liuliuliu'}},
{multi: true}
)
上面这个更新语句是说:将所有用户id>10的用户,user修改为liuliuliu
通过命令可以看到,id in (11,12)的两条数据已经修改为:liuliuliu了
- 其他指令
updateOne: 更新单个文档
updateMany: 更新多个文档
replaceOne: 替换单个文档
-
findAndMondify: 这个命令兼容查询和修改指定文档的功能,如下图
默认返回的是旧数据,可以通过选项: new:true,返回最新的结果
例如:
- 其他
-
upsert命令
upsert是一种特殊的更新的命令,其表现为如果目标文档不存在,则执行插入命令,代码如下:
删除文档(delete)
删除单个文档
执行下面的命令可以删除单个文档
db.aaa.remove({id:11})
可以看到文档已经删除了, 查询结果如下
注意:删除命令会删除所有匹配条件的全部文档,如果希望明确限定只删除一个文档,则需要指定justOne参数。
命令格式如下:
db.collection.remove({
<query>,
<justOne>
})
例如:
db.collection.remove({id: 1}, true)
在MongoDB 3.2版本提供了delete语法定义,因此也可以使用deleteOne命令实现删除单个文档。
例如:
db.aaa.deleteOne({user: 'liuliuliu'})
删除全部文档
删除全部文档有三种方式,如下:
db.aaa.remove({})
db.aaa.deleteMany({})
db.aaa.drop()
方式1、2需要对查询范围内的文档逐个删除,如果希望删除整个集合(表),则使用drop命令会更加高效。
drop命令会同时删除集合的全部索引。
返回被删除的数据
如果希望返回删除的数据可以使用命令:findOneAndDelete命令, 示例如下:
db.aaa.findOneAndDelete({id: 10})
执行结果如下: