Mongo特殊操作
Mongo语法
类比mysql中的一些用法,记录mongo用法
1、查询部分字段
字段标注不为0则取该字段,为0则不取,_id字段默认取,除_id外不同字段标注值必须相同
db.getCollection('doctor').find({},{name:1,_id:0})
2、给字段起别名
聚合操作中使用$project
给office字段起别名为科室
//聚合-字段别名
db.getCollection('doctor').aggregate([{
$project: {
_id: 0,
name: 1,
date: 1,
'科室':'$office'
}
}])
3、修改字段名
使用update将字段原名修改
//字段重命名
db.getCollection("doctor").update(
{},
//将字段名修改成doctorId
{ $rename: { "id": "doctorId" } }
, { multi: true }
)
4、日期和字符串
momgo中提供了一些日期相关的函数。
以及字符串和日期之间转换的函数。
Date()生成字符串,new Date()和ISODate()则生成日期
db.nurse.aggregate({
$project: {
date: {$dateToString: {format: "%Y:%m:%d %H:%M:%S:%L",date: '$date'}}
}
})
db.doctor.aggregate({
$project: {
date: {$dateFromString: {format: "%Y/%m/%d",dateString: '$date'}}, //ISODate("2010-04-01T00:00:00.000+0000")
date2: Date(),//字符串 "Thu Jun 17 2021 09:41:19 GMT+0800"
date3: ISODate(), //ISODate("2021-06-17T01:41:19.315+0000")
date4: new Date() //ISODate("2021-06-17T01:41:19.315+0000")
}
})
5、分组查询top5
使用聚合操作分组,按照数量降序排列,取符合条件的top5
////查询相同parentId的数据数量的top5
db.getCollection("fraudType").aggregate(
[
{
$match : {
parentId : {
//字段为字符串类型
$type : 2.0
}
}
},
{
$group : {
_id : '$parentId',
count : {
//分组求和
$sum : 1.0
}
}
},
{
$sort : {
//以count字段倒序排列
count : -1.0
}
},
{
$limit : 5.0
}
]
);
6、匹配、分组、组合、拆分、匹配、排序再取top
通过$push、$addToSet、$unwind这些操作可以轻松实现行转列、列转行
db.getCollection("fraudType").aggregate(
[
{
$match: {
parentId: {
//字段为字符串类型
$type: 'string'
}
}
},
{
$group: {
_id: '$parentId',
count: {
//分组求和
$sum: 1.0
},
last_name: { $last: "$name" },
first_name: { $first: "$name" },
other: { $push: "$code" },
url: { $addToSet: "$name" }
}
}, {
$unwind: "$url"
},
{
$match: {
url: "其他"
}
},
{
$sort: {
//以count字段倒序排列
count: -1.0
}
},
{
$limit: 5.0
},
{
$project: { _id: 0 }
}
]
);
7、主键Id自增
MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识。
但在某些情况下,我们可能需要实现 ObjectId 自动增长功能。
由于 MongoDB 没有实现这个功能,我们可以通过函数实现。
//创建一个计数集合,里面存放主键名和序列最大值
db.createCollection("counters")
//插入一条数据,代表id为productid的数据的序列极值
db.counters.insert({_id:"productid",sequence_value:0})
//自增函数,作用是计数器集合中存在该id则序列加1
function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify(
{
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
"new":true
});
return sequenceDocument.sequence_value;
}
//插入数据,序列加1
db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Apple iPhone",
"category":"mobiles"})
db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Samsung S3",
"category":"mobiles"})
//{ "_id" : 1.0, "product_name" : "Apple iPhone", "category" : "mobiles" }
//{ "_id" : 2.0, "product_name" : "Samsung S3", "category" : "mobiles" }
8、更新
更新语句,通过操作符$set、$unset等修改,除了查询和修改两个参数对象外,第三个参数对象决定是否把符合条件的全修改以及数据不存在该字段时是否插入新字段。
db.getCollection("fraudType").update(
{ code: "01040231" },//匹配条件
{ $set: { name: "其他案件" } }) //修改
db.getCollection("fraudType").update(
{ code: "01040231" },//匹配条件
{ $unset: { name: "其他案件" } }) //置空
db.getCollection("fraudType").update(
{ code: "01040231" },//匹配条件
{ $set: { name: "其他案件" }},//本字段已经不存在
{upsert: true, multi : true}//字段不存在则插入新字段,符合条件则全部修改
)
8、联表查询
使用$lookup操作符可以达到左连接的效果,匹配的数据会被重命名成一个数组返回。
db.nurse.aggregate([{
$lookup: {
from: 'doctor',
localField: "name",
foreignField: "name",
as: "data"
}
},
{ $unwind: "$data" },//把数组拆开
{$project:{
_id: 0,
"data._id": 0 //获取嵌套的数据
}}
])