golang+mongodb+Aggregate管道查询

在go语言中使用mongodb管道创建视图并条件分页查询

使用bson.D{{}}包裹管道关键字条件

例如:

go语言中MongoDB配置qmgo

查询总页数:

bson.D{
{
"$count", "total_count",
},
},
分页查询:
skip为跳过几条数据
跳过条数=当前页-1乘每页数量(如每页20条数据,第一页数据为0-20条,第二页为21-40条)
limit为每页数据条数
skips := (req.Page.Offset - 1) * req.Page.Limit
bson.D{
{
"$skip", int(skips),
},
},
bson.D{
{
"$limit", int(req.Page.Limit),
},
},
//$count与$skip $limit不可一起使用

聚合查询(xxxDao这个表需要连接order、order_detail两个表查询,需要连表查询的根据业务真实情况增加减少bson.D{{需要连表信息}})
err:=dao.orderDao.Aggregate(ctx,qmgo.Pipeline{
bson.D{
{
"$lookup", bson.M{
"from": "order_detal",
"localField": "order_id",
"foreignField": "order_id",
"as": "order_docs",
},
},
},
//拆分
bson.D{
{
"$unwind", bson.M{
"path": "$order_docs",
"includeArrayIndex": "unwind_order_index",
"preserveNullAndEmptyArrays": true,
},
},
},
//需要查询出来的字段 最好命名月go里表单model里字段一致(根据业务而定,类似某语言的实例类)
bson.D{
{
"$project,bson.M{"order_id":"$order_docs.order_id","order_name":"$order_docs.order_name"},
},
},
//条件查询 如需要判断条件是否为空 可在查询外写一个bson.M{}过滤,query:=bson.M{条件} bson.D{{
"$match",query},},

bson.D{
  {
    "$match",bson.M{"user_id":req.userId},
  },
},
//排序需在分页前面
bson.D{
{
"$sort", bson.M{"upsert_time": -1},
},
},
//如查询总页数把 skip、limit换成count
bson.D{
{
"$skip", int(skips),
},
},
bson.D{
{
"$limit", int(req.Page.Limit),
},
},

}).All(&list)

 

posted @ 2022-08-19 11:30  六元  阅读(867)  评论(0编辑  收藏  举报