mongodb语法
BSON Types
BSON Type有2种标识符,整形和字符串
类型 | 数值 | 字符串 | 说明 | |
Double | 1 | “double” | ||
String | 2 | “string” | ||
Object | 3 | “object” | ||
Array | 4 | “array” | ||
Binary data | 5 | “binData” | ||
Undefined | 6 | “undefined” | Deprecated. | |
ObjectId | 7 | “objectId” | ||
Boolean | 8 | “bool” | ||
Date | 9 | “date” | ||
Null | 10 | “null” | ||
Regular Expression | 11 | “regex” | ||
DBPointer | 12 | “dbPointer” | Deprecated. | |
JavaScript | 13 | “javascript” | ||
Symbol | 14 | “symbol” | Deprecated. | |
JavaScript (with scope) | 15 | “javascriptWithScope” | ||
32-bit integer | 16 | “int” | ||
Timestamp | 17 | “timestamp” | ||
64-bit integer | 18 | “long” | ||
Decimal128 | 19 | “decimal” | New in version 3.4. | |
Min key | -1 | “minKey” | ||
Max key | 127 | “maxKey” |
可以使用***$type***操作符使用这些类型。
BSON特定类型
ObjectId
近似唯一,快速生成,已排序的类型,12byte**。**
String
UTF-8格式,
Timestamps
Date
64位整形,从1970.01.01开始的毫秒数。
查询和投影操作符
Name | 意义 |
比较操作符 | |
$eq | 相等 |
$gt | 大于 |
$gte | 大于等于 |
$in | 包含在集合中 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$nin | 不在集合中 |
逻辑操作符 | |
$and | AND |
$not | NOT |
$nor | 同时满足2个条件的,则为false |
$or | OR |
元素操作符 | |
$exists | 字段存在 |
$type | 字段类型为指定类型 |
表达式计算 | |
$expr | |
$jsonSchema | |
$mod | |
$regex | 正则表达式 |
$text | |
$where | |
地理空间 | |
$geoIntersects | |
$geoWithin | |
$near | |
$nearSphere | |
数组操作符 | |
$all | 包含所有指定的元素 |
$elemMatch | 存在元素匹配所有指定条件 |
$size | 指定数组大小 |
二进制操作 | |
$bitsAllClear | |
$bitsAllSet | |
$bitsAnyClear | |
$bitsAnySet | |
注释 | |
$comment | |
投影 | |
$ | 投影第一个数组元素 |
$elemMatch | 投影第一个匹配条件的元素 |
$meta | |
$slice |
Update操作
操作符 | 说明 | 语法 |
字段操作 | ||
$currentDate | 设置字段值为当前日期 | |
$inc | 字段值加上指定值 | |
$min | 仅当指定值小于字段值时更新 | |
$max | 仅当指定值大于字段值时更新 | |
$mul | 字段值乘以指定值 | |
$rename | 字段重命名 | |
$set | 设置字段值为指定值 | |
$setOnInsert | 当文档新增时设置值。 | |
$unset | 移除字段值 | |
数组操作 | ||
$ | 代指匹配查询条件的第一个元素 | |
$[] | 代指匹配查询条件的所有元素 | |
$[] | 代指匹配arrayFilters的所有元素 | |
$addToSet | 如果元素不存在则加入数组 | |
$pop | 移除第一或最后的元素 | |
$pull | 移除匹配条件的所有元素 | |
$push | 增加一个元素到数组 | |
$pullAll | 移除匹配一个集合的所有元素 | |
修饰 | ||
$each | 修饰 | |
$position | 修饰$push,指定插入位置 | |
$slice | 修饰$push,限制修改数组的大小 | |
$sort | 修饰$push,排序数组 | |
位运算 | ||
$bit | Performs bitwise AND, OR, and XOR updates of integer values. |
聚合管道阶段
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
集合聚合
db.collection.aggregate()
除了$out, $merge, and $geoNear,所有阶段都可以出现多次。
Stage | Description | 示例 |
$addFields | 增加新字段到文档中,类似 | |
$bucket | ||
$bucketAuto | ||
$collStats | ||
$count | 文档总数 | |
$facet | ||
$geoNear | 输出接近某一地理位置的有序文档 | |
$graphLookup | ||
$group | 分组 | { $group: { _id: null, count: { $sum: 1 } } } |
$indexStats | ||
$limit | 取n条记录 | { $limit : 5 } |
$listSessions | ||
$lookup | 从另外一个文档引入字段 | |
$match | 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。 | { $match : { score : { $gt : 70, $lte : 90 } } } |
$merge | 把结果输出到指定collection | |
$out | 把结果输出到指定collection | { $out: “” } |
$planCacheStats | ||
$project | 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。 | $project : { title : 1,author : 1 ,} |
$redact | ||
$replaceRoot | 用replacementDocument代替当前文档 | { $replaceWith: } |
$replaceWith | 同$replaceRoot | |
$sample | 随机取样 | { $sample: { size: 3 } } |
$set | 增加字段 | { $set: { : , … } } |
$skip | 跳过n条记录 | { $skip : 5 } |
$sort | 排序 | { $sort : { age : -1, posts: 1 } } |
$sortByCount | 分组count,再倒序 | { |
$unset | 排除字段 | { $unset: [ “”, “”, … ] } |
$unwind | 把数组属性平铺,1条记录会平铺成n条记录 | {$unwind: { path: , includeArrayIndex: , //保存元素索引的新字段 preserveNullAndEmptyArrays: //true:path为null, missing,empty array,输出文档。false:不输出 } } |
数据库聚合
db.aggregate( [ { <stage> }, ... ] )
since 3.6
聚合管道操作(标量函数)
Name | Description | 示例 |
数学计算 | ||
$abs | 求绝对值 | |
$add | 加法 | |
$ceil | 大于等于指定值的最小整数 | |
$divide | 除法 | |
$exp | 指数 | |
$floor | 小于等于指定值的最大整数 | |
$ln | 自然对数 | |
$log | 对数 | |
$log10 | 10为底对数 | |
$mod | 求模 | |
$multiply | 乘法 | |
$pow | 求幂 | |
$round | round | |
$sqrt | 求二次根 | |
$subtract | 减法 | |
$trunc | 截断 | |
数组操作 | ||
$arrayElemAt | 求index | |
$arrayToObject | 数组转document | |
$concatArrays | 连接数组 | |
$filter | 过滤 | |
$in | 在集合中 | |
$indexOfArray | 第一个匹配的index | |
$isArray | 是否数组 | |
$map | map | |
$objectToArray | 对象转数组 | |
$range | ||
$reduce | ||
$reverseArray | ||
$size | 数组大小 | |
$slice | 数组切片 | |
$zip | 合并2个数组 | |
逻辑表达式 | ||
$and | and | |
$not | not | |
$or | or | |
比较操作符 | ||
$cmp | *比较**2**个操作数* | |
$eq | 相等 | |
$gt | 大于 | |
$gte | 大于等于 | |
$lt | 小于 | |
$lte | 小于等于指定值的最大整数 | |
$ne | 不等 | |
条件操作符 | ||
Name | Description | |
$cond | ||
$ifNull | ||
$switch | ||
日期操作 | ||
$dateFromParts | ||
$dateFromString | ||
$dateToParts | ||
$dateToString | ||
$dayOfMonth | ||
$dayOfWeek | ||
$dayOfYear | ||
$hour | ||
$isoDayOfWeek | ||
$isoWeek | ||
$isoWeekYear | ||
$millisecond | ||
$minute | ||
$month | ||
$second | ||
$toDate | ||
$week | ||
$year | ||
$add | ||
$subtract | ||
字面表达式 | ||
$literal | ||
对象表达式 | ||
$mergeObjects | ||
$objectToArray | ||
集合操作 | ||
$allElementsTrue | ||
$anyElementTrue | ||
$setDifference | ||
$setEquals | ||
$setIntersection | ||
$setIsSubset | ||
$setUnion | ||
字符串操作 | ||
$concat | ||
$dateFromString | ||
$dateToString | ||
$indexOfBytes | ||
$indexOfCP | ||
$ltrim | ||
$regexFind | ||
$regexFindAll | ||
$regexMatch | ||
$rtrim | ||
$split | ||
$strLenBytes | ||
$strLenCP | ||
$strcasecmp | ||
$substr | ||
$substrBytes | ||
$substrCP | ||
$toLower | ||
$toString | ||
$trim | ||
$toUpper | ||
文本操作 | ||
$meta | ||
三角 函数 | ||
$sin | ||
$cos | ||
$tan | ||
$asin | ||
$acos | ||
$atan | ||
$atan2 | ||
$asinh | ||
$acosh | ||
$atanh | ||
$degreesToRadians | ||
$radiansToDegrees | ||
类型操作 | ||
$convert | Converts a value to a specified type.(since4.0) | |
$toBool | Converts value to a boolean.(since4.0) | |
$toDate | Converts value to a Date.(since4.0) | |
$toDecimal | Converts value to a Decimal128.(since4.0) | |
$toDouble | Converts value to a double.(since4.0) | |
$toInt | Converts value to an integer.(since4.0) | |
$toLong | Converts value to a long.(since4.0) | |
$toObjectId | Converts value to an ObjectId.(since4.0) | |
$toString | Converts value to a string.(since4.0) | |
$type | Return the BSON data type of the field. | |
聚合操作 | ||
$addToSet | ||
$avg | ||
$first | ||
$last | ||
$max | ||
$mergeObjects | ||
$min | ||
$push | ||
$stdDevPop | ||
$stdDevSamp | ||
$sum | ||
Accumulators (in Other Stages) | ||
$avg | ||
$max | ||
$min | ||
$stdDevPop | ||
$stdDevSamp | ||
$sum | ||
变量操作 | ||
$let |
Name
Description
示例
数学计算
$abs
求绝对值
$add
加法
$ceil
大于等于指定值的最小整数
$divide
除法
$exp
指数
$floor
小于等于指定值的最大整数
$ln
自然对数
$log
对数
$log10
10为底对数
$mod
求模
$multiply
乘法
$pow
求幂
$round
round
$sqrt
求二次根
$subtract
减法
$trunc
截断
数组操作
$arrayElemAt
求index
$arrayToObject
数组转document
$concatArrays
连接数组
$filter
过滤
$in
在集合中
$indexOfArray
第一个匹配的index
$isArray
是否数组
$map
map
$objectToArray
对象转数组
$range
$reduce
$reverseArray
$size
数组大小
$slice
数组切片
$zip
合并2个数组
逻辑表达式
$and
and
$not
not
$or
or
比较操作符
$cmp
*比较**2**个操作数*
$eq
相等
$gt
大于
$gte
大于等于
$lt
小于
$lte
小于等于指定值的最大整数
$ne
不等
条件操作符
Name
Description
$cond
$ifNull
$switch
日期操作
$dateFromParts
$dateFromString
$dateToParts
$dateToString
$dayOfMonth
$dayOfWeek
$dayOfYear
$hour
$isoDayOfWeek
$isoWeek
$isoWeekYear
$millisecond
$minute
$month
$second
$toDate
$week
$year
$add
$subtract
字面表达式
$literal
对象表达式
$mergeObjects
$objectToArray
集合操作
$allElementsTrue
$anyElementTrue
$setDifference
$setEquals
$setIntersection
$setIsSubset
$setUnion
字符串操作
$concat
$dateFromString
$dateToString
$indexOfBytes
$indexOfCP
$ltrim
$regexFind
$regexFindAll
$regexMatch
$rtrim
$split
$strLenBytes
$strLenCP
$strcasecmp
$substr
$substrBytes
$substrCP
$toLower
$toString
$trim
$toUpper
文本操作
$meta
三角 函数
$sin
$cos
$tan
$asin
$acos
$atan
$atan2
$asinh
$acosh
$atanh
$degreesToRadians
$radiansToDegrees
类型操作
$convert
Converts a value to a specified type.(since4.0)
$toBool
Converts value to a boolean.(since4.0)
$toDate
Converts value to a Date.(since4.0)
$toDecimal
Converts value to a Decimal128.(since4.0)
$toDouble
Converts value to a double.(since4.0)
$toInt
Converts value to an integer.(since4.0)
$toLong
Converts value to a long.(since4.0)
$toObjectId
Converts value to an ObjectId.(since4.0)
$toString
Converts value to a string.(since4.0)
$type
Return the BSON data type of the field.
聚合操作
$addToSet
$avg
$first
$last
$max
$mergeObjects
$min
$push
$stdDevPop
$stdDevSamp
$sum
Accumulators (in Other Stages)
$avg
$max
$min
$stdDevPop
$stdDevSamp
$sum
变量操作
$let
spring实现
文档结构
{
_id: ObjectId(“5dbbe8ce79829800070b2374”),
SMD: {
source: {
DSN: “XXXX”,
KEY: “5da31fa07c2a5e497e8ded8c844e38bd”
},
infofragment: [
{
storagetype: “inner”,
format: “origin”,
filestore: {
fsname: “爬虫”,
filename: “XXXXX基本数据表”,
fileid: “5dbbe8ce79829800070b2373”
},
adapter: { }
}
],
services: [
{
name: “DataImport”,
handledtime: ISODate(“2019-11-01T08:11:58.369Z”),
version: “1.0”
},
{
name: “TagIdentify”,
handledtime: ISODate(“2020-03-01T13:30:41.006Z”)
}
],
quality: {
status: NumberInt(“1”),
checktime: ISODate(“2020-03-01T13:47:38.289Z”),
version: “EPModel:1”
},
timestamp: ISODate(“2020-03-01T13:30:41.007Z”),
tenantid: “XXXX”
},
UMD: {
creator: null,
bd: “XXXXXX”,
ru: null,
pt: “XXXXX基本数据表”,
bw: “XXXXXX”,
bot: “井”,
root: null,
createdate: null,
publisher: null,
title: “XXXXX基本数据表”,
bo: “”,
bp: “XXXX”,
ds: “XXXXX”
},
version: NumberInt(“42702”)
}
说明:
UMD下属性是不固定的。
查询
1、通过json字符串构造查询对象
Document filter = Document.parse(filter.toJSONString(0));
String collectionName = mongoTemplate.getCollectionName(AppData.class);
MongoCollection collection = mongoTemplate.getCollection(collectionName);
long count = collection.countDocuments(filter);
FindIterable<Document> found = collection.find(filter);
2、正则表达式
Document doc = new Document();
doc.put("$regex", request.getTitle());
doc.put("$options", "i");
filter.put(PATH_UMD_TITLE, doc);
或者
criteriaAll.and(AppData.PATH_UMD_PT).regex(request.getPt(), "i");
聚合
1、根据Services.name作为分组条件,统计数据,services元素展开
// { "$unwind" : "$SMD.services"}
UnwindOperation unwindOperation = Aggregation.unwind("SMD.services");
Criteria criteria = Criteria.where(AppData.PATH_SMD_TENANT).is(tenantId);
MatchOperation matchOperation = Aggregation.match(criteria);
//{ "$project" : { "servicename" : "$SMD.services.name" }}
ProjectionOperation projectionOperation = Aggregation.project().and("SMD.services.name").as("servicename");
//{ "$group" : { "_id" : { "servicename" : "$servicename"} , "total" : { "$sum" : 1}}}
GroupOperation groupOperation = Aggregation.group("servicename"
).count().as("total");
//========统计所有记录
Aggregation aggregationAll = Aggregation.newAggregation(
matchOperation
, unwindOperation
, projectionOperation
, groupOperation
, Aggregation.project("servicename", "total")
.and("servicename").previousOperation()
);
AggregationResults resultAll = mongoTemplate.aggregate(aggregationAll, AppData.class, ServiceCountEntity.class);
List<ServiceCountEntity> valuesAll = resultAll.getMappedResults();
return valuesAll.stream().collect(Collectors.toMap(
ServiceCountEntity::getServiceName
, ServiceCountEntity::getTotal
));
2、根据UMD指定的字段统计
Criteria criteria = Criteria.where(AppData.PATH_SMD_TENANT).is(tenantId);
String path = StrUtil.format("UMD.{}", tag);
GroupBy groupBy = GroupBy.key(path).initialDocument("{}").reduceFunction("function(doc, prev){}");
GroupByResults r = mongoTemplate.group(criteria, mongoTemplate.getCollectionName(AppData.class), groupBy, BasicDBObject.class);
List<Document> valuesAll = (List<Document>) r.getRawResults().get("retval");
return valuesAll.size();
修改
1、通过id查询文档,并修改UMD属性
Criteria criteriaId = Criteria.where("_id").is(new ObjectId(id));
Query query = new Query(criteriaId);
Update update = new Update();
//更新UMD
for (Map.Entry<String, Object> entry : umd.entrySet()) {
update.set(StrUtil.format("UMD.{}", entry.getKey()), entry.getValue());
}
mongoTemplate.updateFirst(query, update, AppData.class);
2、修改Services下元素,通过name匹配,如果不存在则插入元素
Criteria criteriaId = Criteria.where("_id").is(new ObjectId(id));
Query query = new Query(criteriaId);
Document service = new Document();
service.put("name", "TagIdentify");
Update update = new Update();
//删除一个匹配的数组元素
update.pull("SMD.services",service);
//先更新一次,如果service存在(name相同),则删除。
mongoTemplate.updateFirst(query, update, AppData.class);
service.put("handledtime", new Date());
service.put("version", "1.0");
Update updateAdd = new Update();
//新增服service
updateAdd.addToSet("SMD.services", service);
mongoTemplate.updateFirst(query, updateAdd, AppData.class);