2.MongoDB 初级Shell语法操作
0. 进入Shell操作界面
# 进入第一篇我们部署的mongoDB单机版目录
cd /opt/mongodb/bin
./mongo localhost:27017
1. 数据库操作
1.1 查看数据库
show dbs;
1.2 创建数据库
use xswl;
请注意, 执行完这句话之后, 再执行 show dbs;
你会发现xswl其实并没有在列表里, 这是因为在 MongoDB 中, 集合只有在内容插入后才会创建! 就是说, 创建集合(数据表)后要再插入一个文档(记录), 集合才会真正创建.
所以你需要执行插入操作, 这时 --> show dbs; 就看得到了.
1.3 删除数据库
db.dropDatabase();
2. 集合操作
2.1 增加集合
集合相当于数据库表, 但是mongodb可以不使用语句创建, 可以直接'指定集合插入, 表自动创建.
# 无参数
db.createCollection("you collection Name");
# 有参数
db.createCollection("colName", options);
options具体可看: https://www.runoob.com/mongodb/mongodb-create-collection.html
2.2 删除集合
db.${collectionName}.drop();
2.3 查看集合
show tables;
# 或者
show collections;
3. 数据操作
3.1 插入数据
db.COLLECTION_NAME.insert(document);
db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
3.2 更新数据
# 基本语法: db.collection.update({query}, {$set:{key:value}});
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
详细请看:https://www.runoob.com/mongodb/mongodb-update.html
3.3 删除数据
db.col.remove({query});
# 删除全部数据
dn.col.remove({});
3.4 查询数据
db.col.find({and}, {projection});
https://www.runoob.com/mongodb/mongodb-query.html
3.5 条件操作符
- $gt --> greater than --> >
- $gte --> gt equal --> >=
- $lt -->less than --> <
- $lte --> lt equal --> <=
- $ne --> not equal --> !=
- $eq --> equal --> =
# select * from col where likes > 100;
db.col.find({likes : {$gt : 100}})
3.6 limit & skip
# 通常用来做分页, 只会显示第二条. 跳过一条, 显示一条. 先skip再limit, 和顺序没有关系
db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
补充说明skip和limit方法只适合小数据量分页, 如果是百万级效率就会非常低, 因为skip方法是一条条数据数过去的, 建议使用where_limit
在查看了一些资料之后, 发现所有的资料都是这样说的:
不要轻易使用skip来做查询, 否则数据量大了就会导致性能急剧下降, 这是因为skip是一条一条的数过来的, 多了自然就慢了.
这么说skip就要避免使用了, 那么如何避免呢? 首先来回顾SQL分页的后一种时间戳分页方案, 这种利用字段的有序性质, 利用查询来取数据的方式, 可以直接避免掉了大量的数数. 也就是说, 如果能附带上这样的条件那查询效率就会提高, 事实上是这样的么? 我们来验证一下:
这里我们假设查询第100001条数据, 这条数据的Amount值是:2399927, 我们来写两条语句分别如下:
b.test.sort({"amount":1}).skip(100000).limit(10) //183ms
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
结果已经附带到注释了, 很明显后者的性能是前者的三分之一, 差距是非常大的. 也印证了skip效率差的理论.
3.7 sort
# 1 为正序, -1 为倒序
db.COLLECTION_NAME.find().sort({KEY:1})
skip(), limilt(), sort()三个放在一起执行的时候, 执行的顺序是先 sort(), 然后是 skip(), 最后是显示的 limit().
4. bulkWrite
批量插入可以使用insertMany(), 但是如果是批量操作呢? 例如我想在一次请求中包含插入, 修改, 删除操作. 这个时候就得用上bulkWrite().
db.collection.bulkWrite() 方法提供了执行批量插入、更新和删除操作的能力.
# 格式
db.collection.bulkWrite(
[ <operation 1>, <operation 2>, ... ],
{
writeConcern : <document>,
ordered : <boolean>
}
)
参数 | 类型 | 描述 |
---|---|---|
operations | array | bulkWrite() 写操作的数组. 支持操作:insertOne、updateOne、updateMany、deleteOne、deleteMany、replaceOne |
writeConcern | document | 可选, write concern 文档, 省略则使用默认的 write concern. |
ordered | boolean | 可选, 表示mongod实例有序还是无序执行操作。默认值true. |
方法返回值: |
- 操作基于 write concern 运行则 acknowledged 值为true,如果禁用 write concern 运行则 acknowledged 值为false。
- 每一个写操作数。
- 成功 inserted 或 upserted文档的 _id 的组数。
# 实例
try {
db.characters.bulkWrite(
[
{ insertOne :
{
"document" :
{
"_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4
}
}
},
{ insertOne :
{
"document" :
{
"_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3
}
}
},
{ updateOne :
{
"filter" : { "char" : "Eldon" },
"update" : { $set : { "status" : "Critical Injury" } }
}
},
{ deleteOne :
{ "filter" : { "char" : "Brisbane"} }
},
{ replaceOne :
{
"filter" : { "char" : "Meldane" },
"replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 }
}
}
]
);
}
catch (e) {
print(e);
}