增
向数据库中插入文档的三种方式:
- db..insert()//将一个或多个文档插入到集合中,(可以是对象,也可以是数组)。
- db..insertOne()//将单个文档插入到集合中,(只能传对象)。
- db..insertMany()//将多个文档插入到集合中,(必须传数组)。
当我们像集合中插入文档的时候,如果没有给文档指定_id,那么数据库会自动为文档添加_id。
注意:_id属性我们也可以自己指定,但是建议自动生成不要自己指定 该属性为文档的唯一标示(比如我们在实际开发中想要吧开发数据库中的数据导入到生产的数据库中,为了避免有相同的数据而发生冲突,_id作为文档的唯一标示,就解决了这个问题)
*/
db.test.find({"age": {"$lt": 7}})
db.test.insert({name:'李大狗',age:22})
db.test.insertOne({name:'wwt',age:22})
db.test.insert([
{name:'舍河上',age:22},
{name:'白骨精',age:22},
{name:'蜘蛛精',age:22}
])
db.test.insert({_id:'hello',name:'cindy',age:22})
查
- db.collection.find()//返回数据库中符合条件的所有文档
- find()返回的是一个数组//可以通过索引去拿到确切的某一个的值,例如:db.test.find()[0]
- 查询数据库中所有符合条件的文档
- 可以接受一个对象作为条件参数
- db..find().count()//返回数据库中符合条件的文档数量
db.集合名.find().limit(数量) // 限制数量
db.集合名.find().skip(数量) // 跳过指定数量
db.test.find().limit(4).skip(1)
db.test.find().skip(1).limit(4)
db.numbers.find({}).skip(20).limit(10)
注意limit()和skip()谁写前谁写后效果是一样的
实际开发中的分页db.numbers.find({}).skip((页码-1)*每页显示的条数).limit(10)
排序:db.集合名.find().sort({“字段名”:1});注意:也可以同时指定多个排序规则:db.集合名.find().sort({“字段名1”:1},{“字段名2”:-1})//表示先按照字段名1进行升序,如果字段名1的属性值相同再按照字段名2进行降序排列。
1: 表示升序
-1:表示降序
limit、skip、sort在调用的时候可以以任意的顺序进行调用,不影响结果。
比较查询
小于:$lt
大于等于:$gte
小于等于:$lte
非等于:$ne
db.<collection>.find({"age": {"$gt": 7}});
db.<collection>.find({"age": {"$lt": 2}});
db.<collection>.find({"age": {"$lt": 4, "$gt": 2}});
db.<collection>.find({"age": {"$lte": 4, "$gte": 2}});
db.<collection>.find({"age": {"$ne": 9}});
$or或者
db.collection2.find({"$or": [{"age": 0}, {"name": "李大狗9"}]});
in和not in查询(包含、不包含)
db.collection2.find({"age": {"$in": [3, 6, 9]}});
db.collection2.find({"age": {"$nin": [3, 6, 9]}});
指定字段返回: db.集合名.find({},{“字段名”:0});
1:返回
0:不返回 # 如下: _id 不返回,即不显示 _id。
db.test.find().sort({"age": -1}).limit(4);
db.collection2.find({}, {"name": 1, "age": 1, "_id": 0});
db.<collection>.findOne()//返回数据库中符合条件的第一个文档
findOne()返回的是一个对象//可以这样使用db.test.findOne().name
改
- db.集合名.update({“条件字段名”:”字段值”},{$set:{“要修改的字段名”:”修改后的字段值”}});//默认只修改匹配到的第一个文档
db.collection.find({"name": "李大狗3"});
db.collection.update({"name": "李大狗3"}, {"$set": {"age": 55}});
db.collection.find({"name": "李大狗3"});
db.test.update({"name: "李大狗"}, {"$unset": {"age": 20}});//`$unset`,删除了name为李大狗的age字段
db.test.update({"name": "李大狗"}, {"$set": {"age": 6}},{ multi:true });//查询到的文档全部修改,增加`multi`属性为true
db.test.update({"name": "李大狗"}, {"$inc": {"age": 2}},{ multi:true });//给姓名是李大狗的人员的年龄增加一岁,\$inc表示:在原来的基础上自增
db.test.update({"name": "李大狗"}, {"$set": {"age": 20}});
db.test.update({"name": "李大狗"}, {"$set": {"address": '辛家庙'}});//如果修改的字段不存在则直接创建一个新的字段
db.test.update({"name": "李大狗"}, {"$unset": {"age": 20}});//删除了name为李大狗的age字段
删(很少使用)
- db.collection.remove({“age”: {“gt”: 50}});//删除符合条件的所有文档,有几个就删除几个
- db.collection.remove({“age”: {“gt”: 50}},true);//传递第二个参数为true就会只删除符合条件的第一个文档
- db.collection.drop()//删除集合
db.test.remove({"age": {"$lt": 7}},true);
内嵌文档
第一步先切换到users
增加(内嵌文档)
插入的值也可以是一个文档,当一个文档的属性值是一个文档的时候,我们称这个文档叫做内嵌文档;例如:插入这样类型的值hobby: { name:[“Lily”], movie:[‘hero’,‘chenglong’]}
db.users.insertMany( [
{name: "lily", price: 80,hobby: { name:["Lily"], movie:['hero','chenglong']} },
{name: "cindy", price: 90,hobby: { name:["cindy"], movie:['haha','hehe']} },
]);
查询(内嵌文档)
mongdb支持直接通过内嵌文档的属性值进行查询,如果要查询内嵌文档则可以通过.的形式查询例如:
注意:属性值必须带引号
db.users.find({'hobby.movie':'haha'})
修改(内嵌文档)
$push向数组中添加一个新元素,不管数组中存不存在改元素都直接添加
$addToSet:向数组中添加一个新元素,如果数组中存在改元素则不会添加(有去重的功能)
db.users.update({name:"lily"},{$push:{'hobby.movie':'dahuaxiyou'}})
删除
删除喜欢hero的元素
db.users.remove({'hobby.movie':'hero'})
删除users集合
方法1:
db.users.remove({});
方法2:
db.users.drop()
一次性插入大量数据一定要注意代码的合理性
let arr = [];
for(let i=1; i<=20000; i++){//15s
arr.push({num:i})
}
db.numbers.insert(arr)