场景1:根据用户分组,查询相同的用户下,同时包含多个角色
db.getCollection('Sys_RT_Rel_Role_User').aggregate([ {$group: { _id: "$USER_CD", // 根据什么字段分组 "ROLE_CD": {"$push": "$ROLE_CD"}, //根据USER_CD分组,然后把ROLE_CD放进列表里 count: {$sum:1} } }, {$match: {"ROLE_CD": {$all: ["GATE_ROLE_DF_FILL","GATE_ROLE_DF_CITY_MANAGER"]}} //根据上面放进列表的ROLE_CD,查询同时包含多个角色 }, ])
当match在group之前类似于SQL的where操作,在group之后类似于SQL的having操作
场景2:根据两个字段分组查询重复的
db.getCollection('Sys_RT_Rel_Role_User').aggregate([ { $group: { _id: { role_cd: '$ROLE_CD', user_cd: '$USER_CD' }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } } ])
场景3:替换某个字段(ADDVCD)指定字符串,将0000——>替换为0100
db.getCollection("Sys_RT_Unit").find({"DZ_INIT_FLAG":"0"}).forEach(//循环获取目标数据 function(item) { var message = item['ADDVCD']; message = message.replace(/0000/g, '0100'); //目标字符串替换,/g 标识全局变量直接解决raplaceAll不支持方案,可以替换多个串 db.getCollection('Sys_RT_Unit').updateOne({ "_id": item['_id'] }, { $set: { "ADDVCD": message } }); //修改目标字段,完成替换 });
场景4:查询字段以某字符串开头的文档
db.getCollection("Sys_RT_User").find({ DATA_SOURCE : /^UNION_IMPORT_/ }).count() //查询DATA_SOURCE字段以UNION_IMPORT开头的所有文档数量
场景5:根据一个集合的字段,更新另一个集合的字段
var cursor = db.getCollection('LANZHENG_EXISTS').find(); cursor.forEach( function(item){ db.getCollection("Sys_RT_User").update({PHONE:item.PHONE},{$set:{LANZHENG_EXISTS_FLAG:'1'}},true) } )
源集合:LANZHENG_EXISTS
目标集合:Sys_RT_User 的LANZHENG_EXISTS_FLAG字段
根据手机号相等