前言
$project
为投射查询 ,即将一个数据结果映射为另一个结果 过程中可以对某些数据进行修改 控制其最终显示的结果。
通过使用$project
操作符,您可以根据需要精确控制聚合操作输出文档的结构。它能够帮助您从聚合管道中提取所需的字段,对字段进行重命名、计算和过滤,以满足数据处理和查询的需求。同时,使用$project
还可以减少传输的数据量,提高查询的效率。
$project
操作符可以完成以下几个任务:
- 字段选择: 通过在
$project
中指定字段名称,可以选择输出文档中要包含的字段。只有指定的字段会在输出文档中出现,其他字段将被排除。 - 字段重命名: 在
$project
中,可以使用表达式对字段进行重命名。通过指定新的字段名,并将原始字段的值赋给新字段,可以在输出文档中改变字段名称。 - 计算表达式:
$project
支持使用各种表达式对字段进行计算和转换。您可以在$project中使用算术运算符、逻辑运算符、条件运算符和聚合运算符等来对字段进行计算和转换。这使得您可以在输出文档中生成新的计算字段。 - 字段的显示与隐藏:
$project
还允许您通过设置字段的值为1或0来控制字段的显示与隐藏。将字段设置为1将显示该字段,将字段设置为0将隐藏该字段
1、原字段查询
原字段查询,_id-默认显示,0-表示不显示,1-表示显示,如何只是原字段查询和find()一致
# 比如:select userid,price from test
db.test.aggregate(
{"$project":{
"_id":0,
"userid":1,
"price":1,
}})
效果:
2、数学表达式查询
数学表达式查询,类型如下:
{"$add":[expr1,expr2,...,exprN]}
#相加
{"$subtract":[expr1,expr2]}
#第一个减第二个
{"$multiply":[expr1,expr2,...,exprN]}
#相乘
{"$divide":[expr1,expr2]}
#第一个表达式除以第二个表达式的商作为结果
{"$mod":[expr1,expr2]}
#第一个表达式除以第二个表达式得到的余数作为结果
注意:expr可以为字段也可以为具体数值,可以多个表达式一起使用。
效果:
3、日期表达查询
日期表达查询:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second
,可以多个组合,实际上就是对字段使用日期函数。
db.test.aggregate(
{
"$project":{
"userid":1,
"new_year":{
"$year":"$create_date"
},
"day":{
"$dayOfWeek":"$create_date"
},
"month":{
"$month":"$create_date"
}
}
})
效果:
比如:求时间差:
db.test.aggregate(
{"$project":{"name":1,"new_minute":{
"$subtract":[
{"$minute":new Date()},
{"$minute":"$create_date"}
]
}}}
)
效果:
4、字符串表达式查询
常用类型如下:
{"$substr":[自定义字符串|$字段名,起始位置,截取几个字节]}
{"$concat":[expr1,expr2,...,exprN]}
#指定的表达式或字符串连接在一起返回,只支持字符串拼接
{"$toLower":expr}
{"$toUpper":expr}
截取字段:
db.test.aggregate( {"$project":{"str":{"$substr":["$price",0,1]}}})
截取自定义字符串:
db.test.aggregate( {"$project":{"str":{"$substr":["abcdef",1,2]}}})
拼接字段:
db.test.aggregate( {"$project":{"str":{"$concat":["$userid","1","2"]}}})
拼接字符串:
db.test.aggregate( {"$project":{"str":{"$concat":["abc","1","2"]}}})