MongoDB查询语句--入门学习

查询操作–单文档查询

无条件查询

db.集合名称.find()
db.集合名称.findOne()

有条件查询–find({query},{projection})

query:包裹查询条件
projection:包裹指定返回字段

单条件查询
  • 等于:{field:value}
db.Order.find(
    {
        "activityId": 62
    }
)
  • 大于:{field:{$gt:value}}
db.Order.find(
    {
        "activityId": {
            $gt: 60
        }
    }
)
  • 大于等于:{field:{$gte:value}}
db.Order.find(
    {
        "activityId": {
            $gte: 60
        }
    }
)
  • 小于:{field:{$lt:value}}
db.Order.find(
    {
        "activityId": {
            $lt: 60
        }
    }
)
  • 小于等于:{field:{$lte:value}}
db.Order.find(
   {
       "activityId": {
           $lte: 60
       }
   }
)
  • 不等于:{field:{$ne:value}}
db.Order.find(
    {
        "activityId": {
            $ne: 62
        }
    }
)
  • 多值查询:{field:{$in:value}}
db.Order.find(
   {
       "activityId": {
           $in: [62,57]
       }
   }
)
多条件查询
  • and条件:{field1:value1,field2:value2}
db.Order.find(
    {
        "activityId": 57,"mobile":"18578603549"
    }
)
  • or条件:{$or:[{field1:value1},{field2:value2}]}
db.Order.find(
    {
        $or: [
            {
                "activityId": 57
            },
            {
                "mobile": "18024523131"
            }
        ]
    }
)
  • and和or联合使用:{$and:[{field1:value1},{field2:value2}],$or:[{field3:value3}]}
db.GroupBookingTaskMongo.find({
   $and: [{
       "activityId": {
           $gt: 57
       }
   }, {
       "mobile": "18024523131"
   }],
   $or: [{
       "orderNo": "30122021113000003583419257"
   }]
})
去重查询:distinct(field,query)
db.GroupBookingTaskDetailMongo.distinct("mobile",{	 
"taskId":89
})
分页查询:skip(m).limit(n)
db.GroupBookingTaskDetailMongo.find(
    {
        "taskId":89
    }
).skip(3).limit(10)//跳过前3条数据,取10条数据

聚合查询:aggregate([pipeline])

pipeline:管道,常用关键字有:$match、$group、$project、$sort,可实现分组、统计、排序等复杂查询

  • 写聚合查询语句时,需注意:

最好一步步执行,执行完第一步看会得到什么结果,再根据该结果补充下一个脚本

分组汇总–需求1:统计不同任务每个号码的参与次数(按任务id和号码分组)

思路:
1、先按条件查询$match
2、按字段分组$group
3、要显示哪些字段$project

db.Task.aggregate([
    {
        $match:{//条件查询
            "validFlag":1,
            "newFlag":0
        }
    },
    {
        $group:{//分组
            _id:{//先按taskId分组,再按mobile分组
                "taskId":"$taskId",
                "mobile":"$mobile"
            },
            count:{$sum:1}
        }
    },
    {
        $project:{//显示哪些字段,$_id表示前面的查询结果中会输出$_id的集合
            "_id":0,
            "taskId":"$_id.taskId",
            "mobile":"$_id.mobile",
            "count":"$count"
        }
    },
    {
        $sort:{//排序
            taskId:-1
        }
    }
])
分组汇总–需求2:统计不同任务的参与人数(同一个号码算一个)

思路:
1、先按条件查询$match
2、按taskId和号码分组$group
3、要展示哪些字段$project
4、再按taskId分组$group得到人数
5、要展示哪些字段$project

db.Task.aggregate([
    {
        $match:{//条件查询
            "validFlag":1,
            "newFlag":0
        }
    },
    {
        $group:{
            _id:{
                taskId:"$taskId",
                mobile:"$mobile"
            },
            count:{$sum:1}
        }
    },
    {
        $project:{
            _id:0,
            taskId:"$_id.taskId",
            mobile:"$_id.mobile",
            count:"$count"
        }
    },
    {
        $group:{
            _id:{
                taskId:"$taskId"
            },
            count:{$sum:1}
        }
    },
    {
        $project:{
            _id:0,
            taskId:"$_id.taskId",
            userCount:"$count"
        }
    }
])

连表查询–$lookup

db.Task.aggregate([
    {
        $lookup:{//左连接
            from:"TaskDetail",//关联Task表
            localField:"taskId",//Task表关联的字段
            foreignField:"_id",//TaskDetail表关联的字段
            as:"result"//返回数据所在的属性名称
        }
    },
	{
    $unwind:"$taskDetails"//将数组展开
	}
])
上一篇:MongoDB的使用及评论功能实战


下一篇:mongodb 插入/更新/删除 文档