安装 MongoDB
安装命令仅供参考,请从官网获取对应版本的下载地址。 官网地址:https://www.mongodb.com/try/download/community
# CentOS 8 安装
mkdir -p /data /data/db
cd /data/
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.1.tgz
tar -xvf mongodb-linux-x86_64-rhel80-4.4.1.tgz
export $PATH=$PATH:/data/mongodb-linux-x86_64-rhel80-4.4.1/bin
mongod --dbpath /data/db -port 27017 --logpath /data/db/monogod.log --fork
导入示例数据
curl -O -k https://raw.githubusercontent.com/tapdata/geektime-mongodb-course/master/aggregation/dump.tar.gz
tar -xvf dump.tar.gz
mongorestore -h localhost:27017
基本操作
插入数据 insert
db.fruit.insertOne({ name: 'apple' });
db.fruit.insertMany([{ name: 'apple' }, { name: 'pear' }, { name: 'orange' }]);
查询文档 find
db.movies.find({ year: 1975 }); // 单条件查询
db.movies.find({ year: 1975, title: 'Batman' }); // 多条件 and 查询
db.movies.find({ $and: [{ year: 1975 }, { title: 'Batman' }] }); // and的另一种查询
db.movies.find({ $or: [{ year: 1975 }, { title: 'Batman' }] }); // 多条件查询
db.movies.find({ title: /^B/ }); // 按正则表达式查询
查询条件对照
SQL | MQL |
---|---|
a=1 | {a:1} |
a<>1 | {a:{$ne:1}} |
a>1 | {a:{$ge:1}} |
a>=1 | {a:{$gte:1}} |
a<1 | {a:{$lt:1}} |
a<=1 | {a:{$lte:1}} |
查询逻辑对照
SQL | MQL |
---|---|
a=1 AND b=1 | {a:1,b:1} |
a=1OR b=1 | {$or:[{a:1},{b:1}]} |
a IS NULL | {a:{$exists:false}} |
a IN (1,2,3) | {a:{$in:[1,2,3]}} |
mongodb 中的查询逻辑运算符
$lt
: 存在并小于$lte
: 存在并小于$gt
: 存在并大于$gte
: 存在并大于等于$ne
: 不存在或存在但不等于$in
: 存在并在指定的数组中$nin
: 不在指定的数组中$or
: 匹配其中的一个条件$and
: 匹配全部条件
查询子文档
文档内容:
db.fruit.insertOne({
name: 'apple',
from: {
country: 'China',
province: 'Guangdon',
},
})
可以查到数据示例:
表示查询文档中
from
字段,子文档中country
字段,值为China
的数据
db.fruit.find({ 'from.country': 'China' });
查询不到数据示例:
表示查询文档中
from
字段的值为{ country: 'China' }
的数据
db.fruit.find({ from: { country: 'China' } });
查询数组中的值
文档内容
db.fruit.insert([
{ name: 'Apple', color: ['red', 'green'] },
{ name: 'Mango', color: ['yellow', 'green'] },
]);
查询语句
表示查询
color
中包含值red
的数据
db.fruit.find({ color: 'red' });
表示查询
color
中包含值red
或包含值yellow
的数据
db.fruit.find({ $or: [{ color: 'red' }, { color: 'yellow' }] });
数组子文档中查询
db.movies.insertOne({
title: 'Raiders of the Lost Ark',
filming_locations: [
{ city: 'Los Angeles', state: 'CA', country: 'USA' },
{ city: 'Rome', state: 'Lazio', country: 'Italy' },
{ city: 'Florence', state: 'SC', country: 'USA' },
],
});
db.movies.find({ 'filming_locations.city': 'Rome' });
搜索子对象的多个字段
$elemMatch
:表示必须是同一个子对象满足多个条件
db.getCollection('movies').find({
'filming_locations.city': 'Rome',
'filming_locations.country': 'USA',
});
db.getCollection('movies').find({
filming_locations: {
$elemMatch: { city: 'Rome', country: 'USA' },
},
});
控制 find 返回的字段
_id
字段必须明确指明,否则默认返回
在 mongodb 中我们称这为投影(projetion)
0 表示不返回,1 表示返回
db.movies.find({ category: 'action' }, { _id: 0, title: 1 });
删除数据 remove
匹配查询条件的文档会被删除
指定一个空文档条件会删除所有文档
db.movies.remove({ a: 1 }); // 删除a等于1 的记录
db.movies.remove({ a: { $lt: 5 } }); // 删除a小于5的记录
db.movies.remove({}); // 删除所有记录
db.movies.remove(); // 报错
更新数据 update
db.<集合>.update(<查询条件>,<更新字段>)
文档内容
db.fruit.insertMany([{ name: 'apple' }, { name: 'pear' }, { name: 'orange' }]);
db.fruit.updateOne({ name: 'apple' }, { $set: { from: 'China' } });
使用 updateOne
表示无论条件匹配多少条记录,始终只更新第一条
使用 updateMany
表示条件匹配多少,就更新多少条
updateOne
/ updateMany
方法要求更新条件部分必须具有以下之一:
$set
/$unset
$push
/$pushAll/$pop
$pull
/$pullAll
$addToSet
更新数组
$push
增加一个对象到数组尾部$pushAll
增加多个对象到数组尾部$pop
从数组尾部删除一个对象$pull
如果匹配指定的值,从数组中删除相应的对象$pullAll
如果匹配任意的值,从数据中删除相应的对象$addToSet
如果不存在则增加一个值到数组
删除集合
db.<集合>.drop()
删除一个集合
集合中全部文档都会被删除
集合相关的索引也会被删除
删除数据库
数据相应文件也会被删除,磁盘空间将被释放
use tempdb
db.dropDatabase()
查看集合、数据库
show collections
show dbs