在Mongodb中存在3个概念:
概念 | 作用 |
---|---|
数据库 | 数据库是一个仓库,在仓库中可以存放集合 |
集合 | 集合类似于数组,在集合中可以存放文档 |
文档 | 文档是数据库中最小单位,我们存储和操作的内容都是文档 |
即一个数据库中存在多个集合,一个集合中存在多个文档。
在mongodb中,数据库和集合都不需要手动创建。在创建文档时,如果文档所在的集合和数据库不存在,将自动创建。
常用命令:
show dbs; //显示所有的数据库
db; //显示所在的数据库
use st; //创建并切换数据库
show collections; //显示数据库中所有的集合
db.st1.insert({"xx":"1232"}); //创建文档st1
一、简单操作
1. 插入对象
语法:db.
插入一个或多个文档。
等效于:
db.
插入一个文档。
db.collection.insertMany();
插入多个文档。
上述这两个方法语义更加清晰。注意,这两个方法均是3.2版本后新增方法。
当向集合中插入文档时,如果没有给指定_id属性,则数据库会自动给文档添加_id。该属性用来作为文档的唯一标识。
//插入一条数据
db.stus.insert({"name":"小猪",age:28,gender:"难"});
//插入多条数据
db.stus.insert([{"name":"数组1",age:28,gender:"女"},{"name":"数组2",age:29,gender:"女"}]);
//查看数据
db.stus.find();
2. 查询操作
语法:db.
查询集合中所有符合条件的文档。find可以接受对象作为条件参数。
默认情况下find()方法无参
或{}
是查询所有对象。
2.1 查询特定属性的对象
db.stus.find({name:"小猪"});
2.2 查询集合中符合条件的第一个文档
db.stus.findOne({name:"小猪"});
findOne直接返回的是一个对象。而find返回的是一个数组。
注意,db.stus.find({name:"小猪"})[0];
可以选择数组中具体的对象。
2.3 统计查询数量
db.stus.find({age:28}).count();
3. 修改操作
语法:db.
(查询条件,修改后的新对象);。
在Mongodb3.2之后,新增3个语法来取代update语法
- replaceOne():替换一个文档
- updateOne():修改一个文档
- updateMany():修改多个文档
3.1 替换一个文档
db.stus.update({name:"小猪"},{age:28});
等效于:
db.stus.replaceOne({name:"小猪"},{age:28});
将name为小猪的文档使用{age:28}
去替换。
3.2 修改指定的属性
语法:$set
db.stus.update(
{"_id":ObjectId("5e64cb476ef8da42f1854b0f")},
{
$set:{"name":"小白兔",gender:"女"}
}
);
修改_id为"5e64cb476ef8da42f1854b0f"的文档的name属性和gender属性。若name或者gender不存在,那么将新增该属性。
db.stus.update(
{name:"小白兔"},
{
$set:{"age":12,gender:"女"}
}
);
修改name为"小白兔"的文档的age和gender属性。
3.3 删除指定属性
语法:$unset
db.stus.update(
{name:"小白兔"},
{
$unset:{gender:"女"}
}
);
3.4 修改多个符合条件的值
db.
,默认情况下只会修改一个文档(即使存在多个符合条件的值)。
但是可以配置db.
去修改多个记录。
db.stus.updateMany(
{gender:"女"},
{
$set:{age:13}
},
{
multi:true //可以修改多条记录
}
);
db.
可以修改多个符合条件的文档。
db.stus.updateMany(
{gender:"女"},
{
$set:{age:11}
}
);
4. 删除操作
语法:
db.
既可以删除一个文档,也可以删除多个文档
db.
删除一个文档
db.
删除多个文档
db.stus.remove({_id:ObjectId("5e64cb476ef8da42f1854b0f")})
注意:remove默认情况下删除多个文档。
//第二个参数为true,即删除一个参数。
db.stus.remove({gender:"女"},true);
注意:如果传递{}
作为参数,那么会清空集合中的所有文档(性能差,因为先匹配在删除)。
若是清空集合,推荐使用db.
若是删除数据库db.dropDatabase();
二、复杂语法
db.inventory.insert([
{item: "小兔", qty: 25, tags: ["黑", "白","灰"], size: { h: 23, w: 21, uom: "cm" }},
{item: "大狼", qty: 25, tags: ["黑", "灰"], size: { h: 19, w: 22.85, uom: "cm" }},
{item: "小鸟", qty: 25, tags: ["蓝"], size: { h: 19, w: 22.85, uom: "cm" }}
])
2.1 关系条件进行查询
- 使用
$in
操作符进行范围查询。
db.inventory.find({tags:{$in:["白","蓝"]}});
- 多个查询条件使用
,
表示AND关系。
db.inventory.find({item:"小兔",qty:{$lt:30}});
等效于:
select * from inventory where item="小兔" and qty<30;
- 使用
$or
操作符表示后面数组中的条件是或者
关系。
db.inventory.find({
$or:[
{item:"小兔"},
{qty:{$gt:22}}
]});
等效于:
select * from inventory where item="小兔" and qty>22;
- 联合使用
AND
和OR
关系
db.inventory.find({
tags:"黑",
$or:[
{item:"小兔"},
{qty:{$gt:22}}
]});
等效于:
select * from inventory where tags="黑" AND (item="小兔" or qty>22);
2.2 对数组进行查询
//清空记录
db.inventory.remove({});
//重新插入
db.inventory.insert([
{item: "小兔", qty: 25, tags: ["黑", "灰","白"], dim_cm: [ 14, 21 ] },
{item: "大狼", qty: 25, tags: ["黑", "灰"], dim_cm: [ 10, 22 ]},
{item: "大象", qty: 25, tags: ["灰", "黑"], dim_cm: [ 14, 25 ]},
{item: "小鸟", qty: 25, tags: ["黑"], dim_cm: [ 5, 9 ]}
]);
2.2.1 匹配数组
- 默认情况下,匹配会要求顺序和个数,下列查询语句要求匹配的文档的tags属性参数和顺序必须相同。
db.inventory.find({
tags:["黑","灰"] //该条件是一个数组,查询的数据需要和该数组顺序相同
});
- 使用
$all
操作符表示取消匹配顺序和个数,只要包含条件中的两个参数的文档,均符合要求。
db.inventory.find({
tags:{
$all:["黑","灰"]
}
});
2.2.2 多条件查询数组
- 默认情况下,多条件查询一个数组。文档内的数组一个元素满足所有条件,也可以是每个元素只满足一部分条件但加起来满足所有条件。
db.inventory.find({
dim_cm:{$gt:22,$lt:25}
});
- 使用
$elemMatch
操作符表示要求数组中至少一个元素满足所有条件。
db.inventory.find({
dim_cm:{$elemMatch:{$gt:9,$lt:13}}
});
- 使用
"数组属性名.下标"
指定数组某一位要满足条件,下标从0开始。
注意:使用.
时json的属性名必须是字符串。
db.inventory.find({
"dim_cm.0":{$eq:14}
});
- 使用
$size
表示要求数组长度满足某条件
db.inventory.find({
tags:{$size:1}
});
2.3 对内联文档数组查询
db.inventory.remove({});
db.inventory.insert([
{item: "tom", instock:[{name:"小猪",age:12},{name:"小狗",age:9}] },
{item: "jerry", instock:[{name:"小鸟",age:2},{name:"小鸡",age:3}] },
{item: "joor", instock:[{name:"小猪",age:12},{name:"小鸡",age:3}] },
{item: "panner", instock:[{name:"小鱼",age:1},{name:"小狗",age:9}] }
]);
- 可以通过直接指定查询一个元素的方式对内联文档数据进行查询。
db.inventory.find({
instock:{name:"小猪",age:12}
});
但是需要注意:顺序或者个数与内联数组的属性不匹配时,均不能匹配。
- 通过内联文档属性进行查询
通过内联文档属性进行查询,会返回数组中至少有一个元素满足匹配的文档。
若文档中内联文档数组中某个对象的age小于等于2,那么就返回。
db.inventory.find({
"instock.age":{$lte:2}
});
指定数组某位置的元素属性满足的条件。
db.inventory.find({
"instock.1.age":{$lte:3}
});
- 指定多条件进行查询
- 对内联文档数组指定多条件查询时,只要求数组中所有元素任意匹配满足所有条件,而不必有一个元素满足所有条件。
因为数据中不存在12
岁的小狗
,但是tom
中有一个12
岁的小猪
和9
岁的小狗
。根据上述语法,可以查询出对应的内容。
db.inventory.find({
"instock.age":12,"instock.name":"小狗"
});
- 可以使用
$elemMatch
要求数组中至少存在一个元素满足所有的条件。
db.inventory.find({
"instock":{$elemMatch:{"age":9,"name":"小狗"}}
});
推荐阅读
官方文档
MongoDB的安装及其CRUD操作