/*
向数据库中插入文档document
如果当前collection不存在会自动创建,如果存在会直接在collection中创建数据
当我们向数据库中插入文档时,如果我们没有指定id,MongoDB会自动给我们的文档创建一个数据id
- 以下两个方法是insert 的一个拆分
- db.<collection>.insertOne();
- 插入一个文档
- db.<collection>.insertMany();
- 插入多个文档
*/
// 插入一条文档
db.user.insert({name:"tyc",age:21})
// 插入多条文档
db.user.insert([
{
name:"tyh",
age:23
},
{
name:"张三",
age:30
}
])
// 每次调用objectid时都会生成一个id,这也是MongoDB生成ID的方法,确保数据的唯一性
ObjectId()
// 自己指定id值,数据库就不会自动给我们创建了
db.user.insert({_id:"hello",name:"自己指定",age:99})
/*
查询
查询集合中所有符合条件的文档
db.<collection>.find()
- find 传入一个对象作为查询条件
*/
// 查询id值为hello的文档
db.user.find({_id:"hello"})
// find返回的是一个集合,可以加索引取出对饮的文档
db.user.find()[0]
// 查看返回结果的条数
db.user.find().count()
// db.collection.findOne() 用来查询集合中符合条件的第一个文档
db.user.findOne({age:21})
/*
修改
db.collection.update(查询条件,新对象)
- update默认情况下会使用新对象替换原来的对象,例如
原始数据:
{
"_id" : ObjectId("5d6cb714a3fdf63e5231744e"),
"name" : "tyc",
"age" : 21.0
}
更新数据:
db.collection.update({name:"tyc"},{age:24})
更新后数据:
{
"_id" : ObjectId("5d6cb714a3fdf63e5231744e"),
"age" : 24.0
}
也就是说会,第二个参数会把原来的数据全部替换,而不是更新某一个值
解决办法:使用操作符
db.collection.update({name:"tyc"},{$set:{age:24}})
$set表示设置查询到的文档的指定字段
删除指定的字段$unset 后面需要删除的字段,值可以随意写,会删除age字段
db.collection.update({name:"tyc"},{$unset:{age:1}})
*/
// 将原来姓名为tyc的文档替换为第二个参数
db.user.update({name:"tyc"},{name:"tyc",age:24})
// 将原来姓名为tyc的文档的name字段更新为elite
db.user.update({name:"tyc"},{$set:{name:"elite"}})
// 删除姓名为elite的文档的age字段
db.user.update({name:"elite"},{$unset:{age:"这里age值随意填写"}})
/*
更新注意:
update只会更新第一个匹配的文档
与updateOne一样只会更新第一个匹配的
需要更新所有的匹配文档
updateMany
*/
//将第一个年龄为21的文档,name字段修改为tyc
db.user.update({age:21},{$set:{name:"tyc"}})
db.user.updateOne({age:21},{$set:{name:"tyc"}})
// 将所有年龄为21的文档,name字段修改为tyc
db.user.updateMany({age:21},{$set:{name:"tyc"}})
// 使用update的第三个参数 可以修改所有匹配的文档信息
// {multi:true}表示是否修改多个默认为false,修改为true,就会修改所有匹配的文档
db.user.update(
{age:21},{$set:{name:"tyc"}},{multi:true}
)
/*
删除
db.collection.remove() 默认删除所有符合条件的文档
db.collection.deleteOne() 删除第一个符合条件的文档
db.collection.deleteMany() 删除所有符合条件的文档
*/
// 删除id值为hello的文档
db.user.remove({_id:"hello"})
// 删除collection中的所有文档,必须要打{},清空集合
db.user.remove({})
// 删除collection
db.user.drop()
// 删除数据库
db.dropDatabase()
/*
文档document之间的关系
- 一对一
- 丈夫和妻子
- 实现方式:内嵌文档
- 一对多
- 用户和订单
- 文章和评论
- 实现方式:内嵌文档or多集合
- 多对多
- 教师与学生
- 实现方式:内嵌文档or多集合
*/
// 内嵌文档实现一对一
db.WifeAndHusband.insert([
{name:"黄蓉",husband:{name:"郭靖"}},
{name:"张飞",husband:{name:"李白"}}
])
// 多集合实现一对多 用户users和订单orders
db.users.insert([
{_id:1,name:"张三"},
{_id:2,name:"李四"},
])
db.orders.insert([
{list:["香蕉","苹果"],userid:1},
{list:["香蕉1","苹果1"],userid:1},
{list:["香蕉2","苹果2"],userid:2},
{list:["香蕉3","苹果3"],userid:2}
])
// 查询语句,就是先查询出姓名为张三的用户的id赋值给外面的查询语句
db.orders.find({userid:db.users.findOne({name:"张三"})._id})
// 多集合实现多对多,教师teachers和学生stus
db.teachers.insert([
{_id:1,name:"张三"},
{_id:2,name:"李四"},
{_id:3,name:"王五"},
])
db.stus.insert([
{name:"孙悟空",teacher_ids:[1,2]},
{name:"猪八戒",teacher_ids:[1,2,3]},
])
/*
sort
查询文档时默认按照——id值来排序,升序排列
sort函数指定排序规则传递一个对象来指定按照哪个字段来排序,对象值1为升序排列,-1位降序排列
*/
db.nbusers.insert([
{name:"张三",age:40,sal:3000},
{name:"张三1",age:7,sal:1500},
{name:"张三2",age:5,sal:2000},
{name:"张三3",age:1,sal:4000},
{name:"张三4",age:3,sal:1000},
{name:"张三5",age:20,sal:1800},
{name:"张三6",age:10,sal:2200},
{name:"张三7",age:4,sal:500},
])
// 默认查询,按照——id来排序,也就是对象的创建时间来排序
db.nbusers.find()
// 按照年龄升序排序
db.nbusers.find().sort({age:1})
// 按照年龄降序来排序
db.nbusers.find().sort({age:-1})
// 按照工资升序排序
db.nbusers.find().sort({sal:1})
// 按照工资降序来排序
db.nbusers.find().sort({sal:-1})
// 先按照年龄升序排序,两个年龄一样的时候,按照工资的降序排序
db.nbusers.find().sort({age:1,sal:-1})
/*
查询时,只要指定的字段的投影,需要使用到查询方法的第二个参数
*/
// 查询时只要返回姓名字段,1表示要0表示不要,—id、默认都会返回,这里直接设置0不返回id值
db.nbusers.find({},{_id:0,name:1})
网友评论