$match 用于对数据进行筛选
{"$match":{"字段":"条件"}},可以使用任何常用查询操作符$gt,$lt,$in,$or等
db.查询数据库名称.aggregate([{"$match":{// 过滤数据的条件}}])
{
$match: {
is_delete:false,
$or:[{字段:'条件'}]
}
}
$addFields 添加字段或者覆盖字段
{ $addFields: { "_id": { "$toString": "$_id" }}} // 用字符串_id覆盖ObjectId的_id
$lookup 数据连表查询
{
$lookup: {
from: '关联表的表名',
localField: '查询表中与关联表相关的字段',
foreignField: '关联表中与查询表相关的字段',
as: '关联表要加入到查询表中的字段名'
}
}
$project 选择要显示的字段,并且过滤关联表中的数据
{"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表达式"}}
_id字段默认显示,要去掉就用0;其他字段不显示直接不写就好,用0弃掉会报错。
数字表达式
{"$add":[expr1,expr2,...,exprN]} #相加
{"$subtract":[expr1,expr2]} #第一个减第二个
{"$multiply":[expr1,expr2,...,exprN]} #相乘
{"$divide":[expr1,expr2]} #第一个表达式除以第二个表达式的商作为结果
{"$mod":[expr1,expr2]} #第一个表达式除以第二个表达式得到的余数作为结果
表达式之日期表达式:
$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second
db.emp.aggregate([
{"$project":{"要显示的字段":1,"date":{"$year":"$日期字段"}}}
])
字符串表达式
{"$substr":[字符串/$值为字符串的字段名,起始位置,截取几个字节]}
{"$concat":[expr1,expr2,...,exprN]} #指定的表达式或字符串连接在一起返回,只支持字符串拼接
{"$toLower":expr}
{"$toUpper":expr}
$group 用于分组
db.emp.aggregate([
{"$group":{"_id":"$分组字段",'显示名称':{"$avg":"$字段名称"}}}
])
数组操作符
{"$addToSet":expr}:去重
{"$push":expr}:重复
{"$first":expr} - 根据资源文档的排序获取第一个文档数据
{"$group":{"_id":"$分组字段","显示字段":{"$push":"$需要显示内容的字段"}}}
$sort ,limit,skip 排序,分页查询
$sort: 1升序,-1降序
$limit:一页要显示的数据,pageSize
$skip:要从第几个开始,(pagenum - 1) *pageSize
$sample 随机查询
db.skill.aggregate([ {"$sample": {size: 5} }]) // 随机查询5条
$unwind 将数组元素拆分为独立字段
{ "_id" : ObjectId(""),"array" : [ "one", "two", "three" ] }
db.test.aggregate({$project:{array:1}},{$unwind:"$array"})
{ "result" : [ { "_id" : ObjectId(""), "tags" : "one" }, { "_id" : ObjectId(""), "tags" : "two" }, { "_id" : ObjectId(""),"tags" : "three" } ], "ok" : 1 }
$filter 过滤要返回的数组子集
{$lookup: {from: 'table', localField: '_id',foreignField: 't_id', as: 'List'} },
{$project: {name: 1, List: {$filter: {input: "$List", as: "item",cond:{$eq: ["$$item.name",""]} } }}}
// cond:{} 里面要过滤数组类型时,不能一层一层直接打点
// cond:{{$eq: [ "$$item.array.name", '']}} 过滤不了
混合使用:
db.数据库名.aggregate([
{ $addFields: { "_id": { "$toString": "$_id" }}},
{
$lookup: {
from: '关联表的表名',
localField: '查询表中与关联表相关的字段',
foreignField: '关联表中与查询表相关的字段',
as: '关联表要加入到查询表中的字段名'
}
},
{
$match: {
_id:''",is_delete:false,
$or:[
{查询表的字段:'要过滤的条件'},
{'关联表要加入到查询表中的字段名.关联表字段':''}
]
}
},
{
$project: {
要显示的字段:1,
关联表要加入到查询表中的字段名:{
$filter: {
input: "$关联表要加入到查询表中的字段名",
as: "item",
cond: {$or: [{$eq: ["$$item.name:"]}]}
}
}
}
}
])
mongodb批量修改字段中的某个字符
db.getCollection('flow_node_copy_update').find({
'content.reply_list.content_list.content':{'$ne':null},
'content.reply_list.content_list.content':{$regex:/~/}}).
forEach(
function(item) {
var tmp = item.content.reply_list
if (tmp.length != 0) {
tmp.forEach(
function(replyList) {
var reply = replyList.content_list
if (reply.length != 0) {
reply.forEach(
function(contentList) {
var content = contentList.content
if (content != null) {
contentList.content = content.replace(/~/g,"!");
print(contentList.content)
}
}
)
}
}
)
}
print(item.content.reply_list[0].content_list[0].content)
db.getCollection('flow_node_copy_update').save(item);
}
);