MongoDB如何创建数据库和集合 | MongoDB中文社区
运行
在 wrap 里面输入,mongo
使用aggregate()统计,可进行分组
使用“use”命令创建数据库
在“use”命令创建MongoDB中的数据库。如果数据库不存在,将创建一个新的数据库
如:
use 数据库名
使用insert()创建集合/表
创建集合的最简单方法是一条记录(不过是由字段名称和值组成的文档)插入到集合中。如果该集合不存在,则会创建一个新的集合如:
db.集合名.insert(
{
“键”:”值”
}
)
注意:键可带双引号,可不带双引号
使用insert()命令添加文档
MongoDB提供insert()命令将文档插入到集合中
db.集合名.insert(
{
“键”:”值”
}
)
使用insert()在MongoDB中插入数组
“insert”命令也可以一次将多个文档插入到集合中
1)创建一个名为myEmployee 的JavaScript变量来保存文档数组
2)将具有字段名称和值的所需文档添加到变量
3)使用insert命令将文档数组插入集合中
如:
let myEmployee=[{“键”:”值”},{“键”:”值”}]
db.集合名.insert(myEmployee)
插入多条是 insertMany
以JSON格式打印
db.集合名.find().forEach(printjson)
printjson命令放入forEach语句。这将导致集合中的每个文档以JSON格式显示
MongoDB主键:使用ObjectId()设置_id字段
在MongoDB中,_id字段是集合的主键,以便可以在集合中唯一地标识每个文档。_id字段包含唯一的ObjectId值。
默认情况下,在集合中插入文档时,如果您没有在字段名称中添加带有_id的字段名称,则MongoDB将自动添加一个ObjectId字段
如果要确保在创建集合时MongoDB不会创建_id字段,并且要指定自己的ID作为集合的_id,则需要在创建集合时明确定义它。
在显式创建id字段时,需要使用名称中的_id创建它。如:
db.集合名.insert({_ id:10,“ EmployeeName”:“ Smith”})
使用find()查询MongoDB中的文档
若查找全部参数可为空
db.集合名.find()
查询条件是一个空对象 {},表示没有限制条件,因此会将数据库中的所有文档都返回
db.集合名.find({EmployeeName : "Smith"}).forEach(printjson);
db.集合名.find({“EmployeeName” : "Smith”})—>mongo的键可带双引号,可不带双引号
EmployeeName : "Smith”—>过滤条件
db.集合名.find({Employeeid : {$gt:2}}).forEach(printjson);
表达式
$lt:小于
$eq:等于
$ne:不等于
$gt:大于
$lt:小于
游标教程
当使用db.collection.find()函数在集合中搜索文档时,结果将返回指向文档集合的指针,该指针称为游标。
var myEmployee = db.Employee.find( { Employeeid : { $gt:2 }});
while(myEmployee.hasNext())
{
print(tojson(myEmployee.next()));
}
在Iterator类中,我们经常用到两个方法: hasNext(), next(),
具体含义: next(), 是返回当前元素, 并指向下一个元素。
hasNext(), 则是判断当前元素是否存在,并指向下一个元素(即所谓的索引)
limit查询结果
db.集合名.find().limit(2).forEach(printjson);
使用limit子句将要返回的文档数限制为2
按降序排序
db.集合名.find().sort({Employeeid:-1}).forEach(printjson)
采用sort函数,该函数返回集合中的所有文档,然后使用修饰符更改返回记录的顺序。这里的-1表示我们要根据Employee id的降序返回文档。值为1则按照升序
count()函数
db.集合名.count() 查询集合中文档的数量是多少
使用update()更新文档
- 发出更新命令;
- 选择要用于确定需要更新哪个文档的条件。例子中,我们要更新员工ID为1的文档;
- 使用set命令修改字段名称;
- 选择要修改的字段名称,并相应地输入新值。
db.集合名.update(
{“Employeeid” : 1},{$set: { “EmployeeName” : “NewMartin”}});
删除文件
所有文档将从集合中删除
db.集合名.remove()
删除符合特定条件的文档
db.集合名.remove({Employeeid:22})
更新多个值
为了确保在MongoDB中同时更新多个/大量文档,需要使用multi选项,因为默认情况下,一次只能修改一个文档。
// 更新多条数据
db.数集合名update({'title':'MongoDB 教程'},{$set:{'name':'MongoDB'}},{multi:true})
索引
查找集合中的所有索引:
db.集合名.getIndexes()
创建索引:createIndex()
单字段索引
db.集合名.createIndex({Employeeid:1})
复合索引
db.集合名.createIndex({Employeeid:1, EmployeeName:1])
删除索引:dropindex()
dropIndexes方法将删除除_id索引以外的所有索引
db.集合名.dropIndex(Employeeid:1)
请记住,每个集合都有_id字段,该字段也算作索引的Field值。由于_id索引字段在最初创建时是集合的一部分,因此numIndexesBefore的值为1
索引就是将文档按照某个(或某些)字段顺序组织起来,以便能根据该字段高效的查询
建立索引后,MongoDB会额外存储一份按age字段升序排序的索引数据,索引结构类似如下,索引通常采用类似btree的结构持久化存储,以保证从索引里快速(O(logN)的时间复杂度)找出某个age值对应的位置信息,然后根据位置信息就能读取出对应的文档。
db.person.getIndexes() // 查询集合的索引信息
[
{
"ns" : "test.person", // 集合名
"v" : 1, // 索引版本
"key" : { // 索引的字段及排序方向
"_id" : 1 // 根据_id字段升序索引
},
"name" : "_id_" // 索引的名称
}
]
复合索引能满足的查询场景比单字段索引更丰富,不光能满足多个字段组合起来的查询,比如db.person.find( {age: 18, name: "jack"} ),也能满足所以能匹配符合索引前缀的查询,这里{age: 1}即为{age: 1, name: 1}的前缀,所以类似db.person.find( {age: 18} )的查询也能通过该索引来加速;但db.person.find( {name: "jack"} )则无法使用该复合索引。如果经常需要根据『name字段』以及『name和age字段组合』来查询,则应该创建如下的复合索引:
db.person.createIndex( {name: 1, age: 1} )
正则表达式
使用$ regex运算符进行模式匹配
db.集合名.find({EmployeeName : {$regex: “Gu” }}).forEach(printjson)
查找所有带有字符“ Gu”的EmployeeName。因此,我们指定$ regex运算符来定义“ Gu”的搜索条件
db.集合名.find({EmployeeName : {$regex: “^Guru99$”}}).forEach(printjson)
在搜索条件中,我们使用^和$字符。^用于确保字符串以特定字符开头,而$用于确保字符串以特定字符结尾
与$ options进行模式匹配
使用不区分大小写参数的$ options,带“ i”参数(表示不区分大小写)的$ options
db.集合名.find({EmployeeName:{$regex: “Gu”,$options:’i’}}).forEach(printjson)
没有regex运算符的模式匹配
不用regex运算符也可以进行模式匹配。
db.集合名.find({EmployeeName: /Gu/’}).forEach(printjson)
“//”选项基本上意味着在这些定界符中指定搜索条件。因此,我们指定/ Gu /再次查找其EmployeeName中具有“ Gu”的文档
从集合中获取最后一个’n’个文档
db.集合名.find().sort({_id:-1}).limit(2).forEach(printjson)
1、查询文档时,请使用sort函数根据集合中的_id字段值以相反的顺序对记录进行排序。-1基本上表示按相反顺序或降序对文档进行排序,以便最后一个文档成为要显示的第一个文档。
2、然后使用limit子句仅显示所需的记录数。
正则表达式 总结:
- 模式匹配可以通过$ regex运算符实现。该运算符可用于在集合中查找某些字符串。
- ^和$符号可用于精确的文本搜索,其中^用于确保字符串以特定字符开头,而$用于确保字符串以特定字符结尾。
- ‘i’和$ regex运算符可用于指定不区分大小写的字符串,以便可以搜索字符串(小写还是大写)。
- 分隔符//也可用于模式匹配。
- 结合使用sort和limit函数可以返回集合中的最后n个文档。可以使用sort函数以降序返回文档,之后可以使用limit子句来限制要返回的文档数。
(创建/删除集合)
显式创建集合语法:db.createCollection(name,options)
参数name是集合名称,该createCollection可用insert代替
删除集合语法:
db.集合名.drop()
创建管理员用户
db.createUser(
{ user: "Guru99",
pwd: "password",
roles:[{role: "userAdminAnyDatabase" , db:"admin"}]})
db.createUser(
{
user: "Employeeadmin",
pwd: "password",
roles:[{role: "userAdmin" , db:"Employee"}]})
修改mongo配置(开启后,每一个数据库都需要进行验证)
sudo vi /etc/mongod.conf 修改为#security:为security: authorization: enabled
校验用户:
db.auth('Employeeadmin','password’)