一、创建数据库
1、use 数据库名
使用use时,如果数据库存在则会进入到相应的数
据库,如果不存在则会自动创建
一旦进入数据库,则可以使用db来引用当前库
2、db.collection.insert(文档)
向集合中插入文档,如果集合不存在则创建
3、db.createCollection()
创建一个新的集合
4、db.collection.drop()
删除集合
二、
1、插入文档
doc:文档或文档数组
<1>
db.collection.insert(doc)
- insert()可以向集合中插入一个或多个文档,分别是传递一个对象,或一个数组。
- 可以将对象或数组中的对象添加进集合中。
- 添加时如果集合或数据库不存在,会自动创建。
- 插入的文档对象会默认添加_id属性,这个属性对应一个唯一的id,是文档的唯一标识。默认会由根据时间戳和机器码生成的ObjectId()来充当,目的就是确保数据唯一性,可以在插入的时候加入_id属性来自己进行添加,而且自己指定也必须确保唯一性.
<2>
db.collection.insertOne(doc)
- 向集合中插入一个文档
<3>
db.collection.insertMany(doc)
- 向集合中插入多个文档
例子:
db.stus.insert({name:"猪八戒",age:28,gender:"男"});
db.stus.insert([
{name:"沙和尚",age:38,gender:"男"},
{name:"白骨精",age:16,gender:"女"},
{name:"蜘蛛精",age:14,gender:"女"}
]);
db.stus.insert({_id:"hello",name:"猪八戒",age:28,gender:"男"});
2、查询文档
condition:查询条件
<1>
db.collection.find()
等同于
db.collection.find({})
- find()用来查询集合中所有符合条件的文档
- find()可以接收一个对象作为条件参数
{ }:表示所有文档
{ 属性:值 }:查询属性是指定值的文档 - 可以根据指定条件从集合中查询所有符合条件的文档
- 返回的是一个数组
<2>
db.collection.findOne(condition)
- 查询第一个符合条件的文档
- 返回的是一个文档对象
<3>
db.collection.find(condition).count()
- 查询符合条件的文档的数量
例子:
db.stus.find({_id:"hello"});
db.stus.find({age:16 , name:"白骨精"});
db.stus.find({age:28});
db.stus.findOne({age:28});
db.stus.find({}).count();
3、修改文档
condition:条件,new object:新的对象
<1>
db.collection.update({condition},{new object})
- 可以修改、替换集合中的一个或多个文档
- update()默认情况下会使用新对象来替换旧的对象
如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
$set 可以用来修改文档中的指定属性
$unset 可以用来删除文档的指定属性 - update()默认只会修改一个,即当有多个文档满足条件的时候,只会修改第一个匹配到的文档。若想修改多个,可以加入multi属性,即multi:true即可把匹配到的全部修改。
<2>
db.collection.updateOne({condition},{new object})
- 修改集合中的一个文档
<3>
db.collection.updateMany({condition},{new object})
- 修改集合中的多个文档
<4>
db.collection.replaceOne()
- 替换集合中的一个文档
例子:
//替换
db.stus.update({name:"沙和尚"},{age:28});
db.stus.update(
{"_id" : ObjectId("59c219689410bc1dbecc0709")},
{$set:{
gender:"男",
address:"流沙河"
}}
)
db.stus.update(
{"_id" : ObjectId("59c219689410bc1dbecc0709")},
{$unset:{
address:1
}}
)
db.stus.updateMany(
{"name" : "猪八戒"},
{
$set:{
address:"猪老庄"
}
}
);
db.stus.update(
{"name" : "猪八戒"},
{
$set:{
address:"呵呵呵"
}
} ,
{
multi:true
}
)
注意:在新版本中update方法已经被弃用了,大家想要修改数据可以使用updateOne()或者updateMany()或者直接使用文档名.属性名的方式修改
4、删除文档
condition:条件
1、删除集合中的文档
<1>
db.collection.remove(condition)
- remove()可以根据条件来删除文档,传递的条件和方式和find()一样
- remove函数必须传参,否则运行会报错,可以传递{}表示空对象
- 删除集合中的一个或多个文档(默认删除多个),可以第二个参数传递一个true,则只会删除一个
- 如果传递一个空对象作为参数,则会删除所有的
<2>
db.collection.deleteOne(condition)
- 删除集合中的一个文档
<3>
db.collection.deleteMany(condition)
- 删除集合中的多个文档
2、清空一个集合
db.collection.remove({})
注意,这样清空集合的性能是略差的,它是通过匹配一个一个的文档,一个一个的删除,选择直接把集合删除会更好
3、删除一个集合
db.collection.drop()
4、删除一个数据库
db.dropDatabase()
注意:一般数据库中的数据都不会删除,所以删除的方法很少调用, 一般会在数据中添加一个字段,来表示数据是否被删除,此外,当一个数据库只有一个集合,一个集合只有一个数据时,如果将该数据删除,集合就会因最后一个文档的删除而被删除,而数据库也会因最后一个集合的删除而被删除。
一般真正使用时的例子:以下isDel的0表示没有删除,1表示已经被删除
db.stus.insert([
{
name:"zbj",
isDel:0
},
{
name:"shs",
isDel:0
},
{
name:"ts",
isDel:0
}
]);
db.stus.updateOne({name:"ts"},{$set:{isDel:1}});
db.stus.find({isDel:0})
三、练习
1、练习一
//1.进入my_test数据库
use my_test
//2.向数据库的user集合中插入一个文档
db.users.insert({
username:"sunwukong"
});
//3.查询user集合中的文档
db.users.find();
//4.向数据库的user集合中插入一个文档
db.users.insert({
username:"zhubajie"
});
//5.查询数据库user集合中的文档
db.users.find();
//6.统计数据库user集合中的文档数量
db.users.find().count();
//7.查询数据库user集合中username为sunwukong的文档
db.users.find({username:"sunwukong"});
//8.向数据库user集合中的username为sunwukong的文档,添加一个address属性,属性值为huaguoshan
db.users.update({username:"sunwukong"},{$set:{address:"huaguoshan"}});
//9.使用{username:"tangseng"} 替换 username 为 zhubajie的文档
db.users.replaceOne({username:"zhubajie"},{username:"tangseng"});
//10.删除username为sunwukong的文档的address属性
db.users.update({username:"sunwukong"},{$unset:{address:1}});
//11.向username为sunwukong的文档中,添加一个hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}
//MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是一个文档时,我们称这个文档叫做 内嵌文档
db.users.update({username:"sunwukong"},{$set:{hobby:{cities:["beijing","shanghai","shenzhen"] , movies:["sanguo","hero"]}}});
db.users.find();
//12.向username为tangseng的文档中,添加一个hobby:{movies:["A Chinese Odyssey","King of comedy"]}
db.users.update({username:"tangseng"},{$set:{hobby:{movies:["A Chinese Odyssey","King of comedy"]}}})
//13.查询喜欢电影hero的文档
//MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档则可以通过.的形式来匹配
//如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
db.users.find({'hobby.movies':"hero"});
//14.向tangseng中添加一个新的电影Interstellar
//$push 用于向数组中添加一个新的元素
//$addToSet 向数组中添加一个新元素 , 如果数组中已经存在了该元素,则不会添加
db.users.update({username:"tangseng"},{$push:{"hobby.movies":"Interstellar"}});
db.users.update({username:"tangseng"},{$addToSet:{"hobby.movies":"Interstellar"}});
db.users.find();
//15.删除喜欢beijing的用户
db.users.remove({"hobby.cities":"beijing"});
//16.删除user集合
db.users.remove({});
db.users.drop();
show dbs;
//17.向numbers中插入20000条数据 7.2s
for(var i=1 ; i<=20000 ; i++){
db.numbers.insert({num:i});
}
db.numbers.find()
db.numbers.remove({});
//0.4s
var arr = [];
for(var i=1 ; i<=20000 ; i++){
arr.push({num:i});
}
db.numbers.insert(arr);
2、练习二
//18.查询numbers中num为500的文档
db.numbers.find({num:500})
//19.查询numbers中num大于5000的文档
db.numbers.find({num:{$gt:500}});
db.numbers.find({num:{$eq:500}});
//20.查询numbers中num小于30的文档
db.numbers.find({num:{$lt:30}});
//21.查询numbers中num大于40小于50的文档
db.numbers.find({num:{$gt:40 , $lt:50}});
//22.查询numbers中num大于19996的文档
db.numbers.find({num:{$gt:19996}});
//23.查看numbers集合中的前10条数据
db.numbers.find({num:{$lte:10}});
//limit()设置显示数据的上限
db.numbers.find().limit(10);
//在开发时,我们绝对不会执行不带条件的查询
db.numbers.find();
//24.查看numbers集合中的第11条到20条数据
/*
分页 每页显示10条
1-10 0
11-20 10
21-30 20
。。。
skip((页码-1) * 每页显示的条数).limit(每页显示的条数);
skip()用于跳过指定数量的数据
MongoDB会自动调整skip和limit的位置
*/
db.numbers.find().skip(10).limit(10);
//25.查看numbers集合中的第21条到30条数据
db.numbers.find().skip(20).limit(10);
db.numbers.find().limit(10).skip(10);
3、练习三
//26.将dept和emp集合导入到数据库中
db.dept.find()
db.emp.find()
//27.查询工资小于2000的员工
db.emp.find({sal:{$lt:2000}});
//28.查询工资在1000-2000之间的员工
db.emp.find({sal:{$lt:2000 , $gt:1000}});
//29.查询工资小于1000或大于2500的员工
db.emp.find({$or:[{sal:{$lt:1000}} , {sal:{$gt:2500}}]});
//30.查询财务部的所有员工
//(depno)
var depno = db.dept.findOne({dname:"财务部"}).deptno;
db.emp.find({depno:depno});
//31.查询销售部的所有员工
var depno = db.dept.findOne({dname:"销售部"}).deptno;
db.emp.find({depno:depno});
//32.查询所有mgr为7698的所有员工
db.emp.find({mgr:7698})
//33.为所有薪资低于1000的员工增加工资400元
db.emp.updateMany({sal:{$lte:1000}} , {$inc:{sal:400}});
db.emp.find()
4、文档间的关系
<1>一对一(one to one)
- 夫妻 (一个丈夫 对应 一个妻子)
- 在MongoDB,可以通过内嵌文档的形式来体现出一对一的关系
例子:
*/一对一
db.wifeAndHusband.insert([
{
name:"黄蓉",
husband:{
name:"郭靖"
}
},{
name:"潘金莲",
husband:{
name:"武大郎"
}
}
]);
db.wifeAndHusband.find();
<2>一对多(one to many)/多对一(many to one)
- 父母 - 孩子
用户 - 订单
文章 - 评论 - 也可以通过内嵌文档来映射一对多的关系
例子:
//一对多 用户(users) 和 订单(orders)
db.users.insert([{
username:"swk"
},{
username:"zbj"
}]);
db.order.insert({
list:["牛肉","漫画"],
user_id: ObjectId("59c47e35241d8d36a1d50de0")
});
db.users.find()
db.order.find()
//查找用户swk的订单
var user_id = db.users.findOne({username:"zbj"})._id;
db.order.find({user_id:user_id});
<3>多对多(many to many)
- 分类 - 商品
老师 - 学生
例子:
//多对多
db.teachers.insert([
{name:"洪七公"},
{name:"黄药师"},
{name:"龟仙人"}
]);
db.stus.insert([
{
name:"郭靖",
tech_ids:[
ObjectId("59c4806d241d8d36a1d50de4"),
ObjectId("59c4806d241d8d36a1d50de5")
]
},{
name:"孙悟空",
tech_ids:[
ObjectId("59c4806d241d8d36a1d50de4"),
ObjectId("59c4806d241d8d36a1d50de5"),
ObjectId("59c4806d241d8d36a1d50de6")
]
}
])
db.teachers.find()
db.stus.find()
四、查询时常用的方法
<1> limit(number)
该方法用于分页查询,number为查询的数据的个数。
例子:查询10条数据
db.numbers.find().limit(10);
<2> skip(number)
该方法用于将数据分割,一般配合limit方法实现分页查询,number为分割的位置。
例子:查询第11条数据到第20条数据
db.numbers.find().skip(10).limit(10);
<3> sort(condition)
该方法用于对查询的结果进行排序。
condition为排序的条件,是一个对象,如{number:-1},number为根据number这个属性进行排序,1为升序排序,-1为降序排序。可以同时指定多个排序规则。
例子:根据number列进行降序排序,如果number列出现相同则按照sal列升序排序。
db.test.find().sort({number:-1},{sal:1});
<4>投影
find方法默认的查询结果是显示全部数据,可以通过设置find函数的第二个参数来进行投影。例子:
db.test.find({},{number:1,_id:0});
如该例子所示,显示number列,隐藏_id列。后面的值为是否显示,1为显示,0为不显示。
注:_id列默认是显示的。
五、$操作符表达式表
操作符 | 功能 |
---|---|
$eq | 匹配等于(=)指定值的文档 |
$gt | 匹配大于(>)指定值的文档 |
$gte | 匹配大于(>)指定值的文档 |
$lt | 匹配小于(<)指定值的文档 |
$lte | 匹配小于等于(<=)指定值的文档 |
$ne | 匹配不等于(≠)指定值的文档 |
$in | 匹配数组中的任一值 |
$nin | 不匹配数组中的值 |
$or | 或 条件查询 |
$and | 与 条件查询 |
$not | 查询与表达式不匹配的文档 |
$nor | 查询与任一表达式都不匹配的文档 |
$exists | 查询存在指定字段的文档 |
$type | 查询类型为指定类型的文档 |
$mod | 取余条件查询 |
$regex | 正则表达式查询 |
$text | 文本索引查询 |
$all | 匹配文档的数组字段中包含所有指定元素的文档 |
$elemMatch(query) | 匹配内嵌文档或数组中的部分field |
$size | 匹配数组长度为指定大小的文档 |
$inc | 将文档中的某个field对应的value自增/减某个数字amount |
$mul | 将文档中的某个field对于的value做乘法操作 |
$rename | 重命名文档中的指定字段的名 |
$setOnInsert | 配合upsert操作,在作为insert时可以为新文档扩展更多的field |
$set | 更新文档中的某一个字段,而不是全部替换 |
$unset | 删除文档中的指定字段,若字段不存在则不操作 |
$min | 将文档中的某字段与指定值作比较,如果原值小于指定值,则不更新;若大于指定值,则更新 |
$max | 与$min功能相反 |
$currentDate | 设置指定字段为当前时间 |
$addToSet | 用于添加一个元素到array中,一般用于update |
$pop | 删除数组中的第一个或最后一个元素,-1表示第一个,没错,第一个;1表示最后一个! |
$pullAll | 删除数组或内嵌文档字段中所有指定的元素 |
$pull | 删除满足条件的元素 |
$push | 往数组中追加指定的元素,若文档中数组不存在,则创建并添加指定元素,自v2.4起,添加了对$.each的支持 |
$each | 需要搭配 addToSet或addToSet或push方可使用 |
$sort | 配合$push使用,表示给文档中的指定数组元素排序,1是升序,-1是降序 |
$position | 配合$push使用表示往数组元素中的指定位置插入元素 |
其他内容可以查询官网:
MongoDB官网:https://www.mongodb.com/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。