什么是monogodb?
MongoDB 是一种开源的、面向文档的 NoSQL 数据库管理系统。它采用了类似 JSON 的 BSON 格式来存储和表示数据,支持高度灵活的非结构化数据模型。它使用 Bson(Binary JSON)格式来存储数据,数据以文档的形式组织,每个文档可以具有不同的结构,没有固定的表结构,更加灵活。并且作为非关系型数据库之一它支持水平扩展,可以通过添加更多的节点来增加数据库的处理能力,实现高可用性和负载均衡。
在MongoDB中,数据存储的基本单位是文档,一个文档相当于关系型数据库中的一行记录。一个集合可以包含多个文档,相当于关系型数据库中的表格。每个文档由多个字段组成,每个字段都有一个名字和一个值。
官网:https://www.mongodb.com/try/download/community
这里下载与安装不做重点讲述,详情可以参考这位博主
注意!mogodb中id默认为object类型
如图所示
一个:db.集合名.insertOne(文档)
多个:db.集合名.insertMany(文档)
一个或多个:db.集合名.insert(文档)
例子:
//增加name和age字段并插入一条文档,值得注意的是,跟mysql不同若不存在字段则会自动创建。
db.Cao.insert({ "name": "zhang","age":"25"});
//增加name为li,age为25的文档
db.Cao.insert({ name: "li",age:"25"});
db.集合名.update(
??? ?<query>,
??? ?<update>,
??? ?{
??? ??? ?upsert:<boolean>,
??? ??? ?multi:<boolean>,
??? ??? ?writeConcern:<documnet>
??? ?}
)
//query为update的查询条件
//update为操作的对象?
//upsert可选,若不存在用于指定更新操作时的行为。它是一个布尔值,表示如果更新操作没有找到匹配的文档,则是否插入一个新文档。如果upsert参数设置为true,则MongoDB将执行一个更新操作,如果没有找到匹配的文档,则插入一个新文档。如果upsert参数设置为false,则MongoDB将不会插入新文档,而是返回一个空的更新结果。
//multi可选,如果不指定,则默认为false,表示只更新第一个匹配的文档。如果设置为true,则MongoDB将更新所有匹配的文档。
//writeConcern可选,抛出异常的级别
例子:
db.collection.update(
{ name: "John" },
{ $set: { age: 30 } },
{ upsert: true, multi: true }
)
在这个示例中,我们更新所有名为"John"的文档,将它们的年龄设置为30。如果没有找到匹配的文档,则插入一个新文档。该操作将更新所有匹配的文档,而不仅仅是第一个匹配的文档。这个操作的确认级别使用默认的写入确认级别。
除了$set操作符之外,还有其他操作符可以用于update()函数。以下是一些常用的操作符:
$inc:用于将一个字段的值增加一个指定的数值。
$push:用于将一个值添加到一个数组中。
$pull:用于从一个数组中删除一个值。
$rename:用于重命名一个字段。
$unset:用于删除一个字段。
db.collection.update(
{ name: "John" },
{ $inc: { age: 1 } }
)
使用remove()函数来删除一个或多个文档
db.collection.remove(
? ?<query>,
? ?{
? ? ?justOne: <boolean>,
? ? ?writeConcern: <document>
? ?}
)
//删除所有文档
db.collection.remove({})
若使用remove直接以id为判断删除
使用deleteOne()函数和deleteMany()函数
//删除名为"John"的第一个文档。
db.collection.deleteOne({ name: "John" })
//这个示例将删除年龄大于30的所有文档。
db.collection.deleteMany({ age: { $gt: 30 } })
查询集合中所有文档
(以名为mycollection的集合为例)db.collection('mycollection').find(query,projection)
查询与条件相匹配的文档,常见条件有
$gt:大于(greater than)
$gte:大于等于(greater than or equal to)
$lt:小于(less than)
$lte:小于等于(less than or equal to)
$gte、$lt、$lte操作符查询指定范围内的文档
$exists操作符用于查询一个字段是否存在于文档中
$all操作符用于查询包含所有指定值的文档。
$in
匹配一个字段的值是否在指定的集合文档中
$and,$or.....
举例
db.collection('mycollection').find({name: 'John'})
db.collection('mycollection').find({age: {$gte: 18}})
db.collection('mycollection').find({gender: {$in: ['male', 'unknown']}})
db.collection('mycollection').find().sort({age: 1})
//age表示要查询的字段,1表示升序,-1表示降序
db.collection('mycollection').find().sort({age:1,id:-1})
//年龄相同时,按照id倒序
db.collection('mycollection').find().skip(10).limit(5)
//skip表示要跳过文档数量,limit表示返回的文档数量
db.Cao.find(
?? ?{
?? ??? ?name:{$regex:/wan/}
?? ?}
)
db.Cao.find(
?? ?{
?? ??? ?name:{$regex:".*wan.*"}
?? ?}
)
上述两个模糊查询查询效果相同,均表示查询含有"wan"字段的数据,但是第一个是正则表达式的对象,而第二个则为正则表达式。
//在Cao集合中新增hobby列
db.Cao.updateMany({},{$set:{hobby:[]}})
//给名字为wang的hobby字段添加java
db.Cao.updateMany({name:"wang"}, {$push:{hobby:"java"}})
//给li添加java,python,c++,这里这种方法将会把这三个元素作为一个·数组添加进去
db.Cao.updateMany({name:"li"}, {$push:{hobby:"java","python","c++"}})
//添加each字段则分开插入每个元素
db.Cao.updateMany({name:"li"}, {$push:{hobby:{$each:["麻将","抽烟","喝酒"]}}})
//删除集合Cao中name为li的hobby数组中第一个元素
//值为1则删除第一个,-1删除最后一个
db.Cao.updateMany({name:"li"},{$pop:{hobby:1}})
//删除集合Cao中name为li的hobby数组中值为抽烟的元素
db.Cao.updateMany({name:"li"},{$pull:{hobby:"抽烟"}})
//将值为蹦极的文档修改为健身
db.Cao.updateMany({name:"li",hobby:"蹦极"},{$set:{"hobby.$":"健身"}})
用于匹配数组中的任何一个元素,语法如下
db.collection.find({ field: { $in: [value1, value2, ...] } });
用于匹配包含数组中所有元素的文档,语法如下
db.collection.find({ field: { $all: [value1, value2, ...] } });
用于匹配具有指定数组大小的文档,语法如下
db.collection.find({ field: { $size: sizeValue } });
用于查询嵌套数组中的元素,语法如下
db.collection.find({ field: { $elemMatch: { subfield: value } } });
用于查询不匹配指定数组条件的文档,语法如下
db.collection.find({ field: { $not: { operator: value } } });
同样的monogodb中也有聚合函数,下面给出一些常见的聚合函数及示例
使用$match筛选年龄大于等于18的用户:
javascriptCopy Codedb.users.aggregate([
{ $match: { age: { $gte: 18 } } }
]);
使用$group按照性别进行分组,并计算每个性别的用户数量:
javascriptCopy Codedb.users.aggregate([
{ $group: { _id: "$gender", count: { $sum: 1 } } }
]);
使用$project选择返回的字段,并新增一个计算字段:
javascriptCopy Codedb.orders.aggregate([
{
$project: {
_id: 0,
order_id: "$_id",
total: { $multiply: ["$price", "$quantity"] }
}
}
]);
使用$limit限制查询结果的数量:
javascriptCopy Codedb.users.aggregate([
? { $limit: 10 }
]);
使用$skip跳过前10条文档:
javascriptCopy Codedb.users.aggregate([
{ $skip: 10 }
]);
使用$sort对价格字段进行升序排序:
javascriptCopy Codedb.products.aggregate([
{ $sort: { price: 1 } }
]);