db.createCollection('for_test')
db.getCollection('for_test').save({'_id':3,'results':[75,88]})
db.getCollection('for_test').find({'results':{'$elemMatch':{'$gte':80,'$lt':85}}})
db.getCollection('for_test').find({'results':{'$size':2}})
- 投影
.$ 字段是否显示
db.getCollection('test_projection').find({'semester':1,grades:{'$gte':85}},{'grades.$':1})
$elemMatch
限制结果集中数组字段,元素为满足条件的第一个
db.getCollection('test_projection').find({'grades':{'$elemMatch':{ '$gte':90 }}})
聚合管道
- 语法格式 db.collection.aggregate(pipeline,options)
pipeline操作数组,有执行顺序
- pipeline
-
$project
决定显示或不显示,字段名字投影别的名字,还可以修改结果值 -
$match 过滤collection 同query
-
$limit 限制最终结果的条数
-
$skip 限制返回记录的起点
-
unwind 将每个文档中的指定数组字段分隔,形成多条文档数据
-
group 分组聚合 {$group:{_id:分组条件字段, <字段名>:{accumulato:expression}}}
KaTeX parse error: Expected '}', got 'EOF' at end of input: group:{_id:"xxx",count_num:{$sum:1}}
- sort 排序 {$sort:{field1:1|-1,…}}
- out {$out:“collection_name”}
- lookup 左外连接
db.getCollection('test_aggregate').aggregate(
[
{ '$project': {
'item':1,
'qty':1,
'result':{$and:[{$gt:["$qty",100]},{$lt:["$qty",250]}]}
}}
])
$and
$or
$not
- $setEquals 检查多个数组字段中元素是否相同,从第一个元素开始,可以有包含关系
{$setEquals:[["a","b","a"],["b","a"]} true
db.getCollection('test_setEquals').aggregate([
{$project:{
A:1,
B:1,
sameElements:{
$setEquals:["$A","$B"]
},
_id:0
}}
])
- setIntersection 取出多个数组字段中元素的交集,无顺序
{$setIntersection:[array1,array2,…]}
db.getCollection('test_setEquals').aggregate([
{$project:{
A:1,
B:1,
sameElements:{
$setEquals:["$A","$B"]
},
commonToBoth:{
$setIntersection:["$A","$B"]
},
_id:0
}}
])
$setUnion 多个数组并集,对顺序无要求
$setDifference
取两个不同元素,对顺序无要求
db.getCollection('test_setEquals').aggregate([
{$project:{
A:1,
B:1,
sameElements:{
$setEquals:["$A","$B"]
},
commonToBoth:{
$setIntersection:["$A","$B"]
},
allValues:{
$setUnion:["$A","$B"]
},
inBOnly:{
$setDifference:["$B","$A"]
},
_id:0
}}
])
$setIsSubset
db.getCollection('test_setEquals').aggregate([{$project:{
A:1,B:1,
sameElements:{
$setEquals:["$A","$B"]
},
commonToBoth:{
$setIntersection:["$A","$B"]
},
allValues:{
$setUnion:["$A","$B"]
},
inBOnly:{
$setDifference:["$B","$A"]
},
AisSubset:{
$setIsSubset:["$A","$B"]
},
_id:0
}}
])
$cmp 比较两个值是否相等,1第一个大于第二个,-1第一个小于第二个
db.getCollection('test_aggregate').aggregate(
[ {
$project:{
item:1,
qty:1,
cmpTo250:{$cmp:["$qty",250]},
_id: 0
}
}]
)
- $seq
db.getCollection('test_aggregate').aggregate(
[ {
$project:{
item:1,
qty:1,
cmpTo250:{$cmp:["$qty",250]},
qtyEq250:{$eq:["$qty",250]},
_id: 0
}
}]
)
gte lt lte ne
-
算术表达式
-
KaTeX parse error: Expected '}', got 'EOF' at end of input: …bs 返回字段值的绝对值 {abs:{}}
-
KaTeX parse error: Expected '}', got 'EOF' at end of input: add {add:[<>,<>]}
-
KaTeX parse error: Expected '}', got 'EOF' at end of input: …ract 减法,可以是日期 {subtract:[<>,<>]}
-
multiply 乘法
{$multiply:[<>,<>]} -
divide 除法
{$divide:[<4>,<2>]} 2 -
mod 取模运算
{$mod:[<4>,<3>]} 1 -
ceil 返回大于等于指定数字的最小整数 向右取整
{KaTeX parse error: Expected 'EOF', got '}' at position 10: ceil: 7.8}̲ 8 {ceil: -2.8} -2 -
floor 返回小于等于指定数字的最大整数 向左取整
{KaTeX parse error: Expected 'EOF', got '}' at position 10: ceil: 7.8}̲ 7 {ceil: -2.8} -3 -
pow 指数 x^y
-
sqrt 开方运算
-
trunc 保留整数
-
concat 字符串连接 $concat:[str1,str2,…]
-
substr 截取字符串 s u b s t r : [ substr:[ substr:[fileds,strat,end]
-
toLower str转小写
-
toUpper str转大写
-
strcasecmp str比较
-
cond 条件表达式 {$cond:{if: <> , then :<> , else :<> }}
-
ifNull 判断一个字段是否为null,如果不是,返回原值
-
数组表达式
-
arrayElemAt 返回数组指定位置元素
{$arrayElemAt: [[1,2,3,4,5] ,0]} 返回1 -
concatArrays 拼接多个数组合并后返回
-
filter 数组过滤
{$filter:{input:,as:,cond:}}
input 表达式或字段 必须是数组
as 数组内的元素定义为一个变量引用
cond 表达式用于过滤数组 -
isArray 判断是否数组
-
size 返回数组元素个数
-
slice 截取数组 {$slice:[ array , position, n ] | [array , n] }
-
map 对数组里的每个元素进行操作并返回操作后新元素数组
{$map:{input:<>, as:<>, in:<>}}
input 数组或者返回数组的表达式
as 将input的数组内的元素定义变量引用
in 用于新元素的生成,并替换掉原值
db.getCollection('test_map').aggregate([
{
$project:{
adjustedGrades:{
$map:{
input:"$quizzes",
as:'grade',
in: {$add:["$$grade",2]}
}
},
quizzes:1
}
}
])
实际发现并不能够替换原数组内的值,而是返回新数组 不知道是不是用的方式导致
db.getCollection('test_let').aggregate([
{
'$project':{
finalTotal:{
$let:{
vars:{
total:{$add:["$price","$tax"]},
discounted:{}
}
}
}
}
}
])