go+MongoDB代码片段

go+MongoDB代码片段

//模糊查询

name := qr.Get("name")
if name != "" {
   cond["user_name"] = primitive.Regex{Pattern: ".*" + name + ".*", Options: ""}
}
phone := qr.Get("phone")
if phone != "" {
   cond["user_phone"] = primitive.Regex{Pattern: phone + ".*", Options: ""}
}
if name != "" {
   query = append(query,
      bson.M{"$match": bson.M{"user.name": primitive.Regex{Pattern: ".*" + name + ".*", Options: ""}}})
}

//多个模糊搜搜

if name != "" {
   query = append(query,
      bson.M{"$match": bson.M{"$or": []bson.M{
         {"allValue.order_sn": primitive.Regex{Pattern: ".*" + name + ".*", Options: ""}},
         {"allValue.product.product_name": primitive.Regex{Pattern: ".*" + name + ".*", Options: ""}},
      }}})
}
phone := qr.Get("phone")
if phone != "" {
   cond["user_phone"] = primitive.Regex{Pattern: phone + ".*", Options: ""}
}

//新增或修改 SetUpsert

_, err := d.GetColl(models.T_Equip).UpdateOne(context.Background(), bson.M{"ip": obj.IP}, bson.M{"$set": obj}, options.Update().SetUpsert(true))
if err != nil {
   log.Println(err)
   resultor.RetErr(w, err.Error())
   return
}

//MongoDB+go format时间

query := make([]map[string]interface{}, 0)
query = append(query, bson.M{"$project": bson.M{
   "_id":0,
   "asset_status": 1,
   "time":bson.M{"$dateToString":bson.M{"format": "%Y-%m-%d","date": "$create_date"}},
   "count": bson.M{"$sum": 1},
}})
query = append(query, bson.M{"$group": bson.M{
   "_id": bson.M{ "time": "$time","status": "$asset_status"},
   "count": bson.M{"$sum": 1},
   "asset_status": bson.M{"$first": "$asset_status"},
   "time": bson.M{"$first": "$time"},
}})
query = append(query, bson.M{"$sort": bson.M{ "time": -1}})
//mongo语句
{
  "$project": {"asset_status": 1,"time": {"$dateToString": {"format": "%Y-%m-%d","date": "$create_date"}}}
},
{
  "$group": {
    "_id": {"time": "$time","status": "$asset_status"},
    "count": {"$sum": 1},
    "asset_status": {"$first": "$asset_status"},
    "time": {"$first": "$time"}
  }
}

//pipeline示例

query = append(query, bson.M{
   "$lookup": bson.M{
      "from": bizTable,
      "let": bson.M{
         "rid": "$original_activity_id",//(让主表的original_activity_id==rid,original_activity_id相当于localField)
      },
      "pipeline": []bson.M{
         {
            "$match": bson.M{
               "$expr": bson.M{
                  "$eq": []string{"$_id", "$$rid"},//(从表(loockup的表)foreignField的_id = rid(主表的original_activity_id))
               },
            },
         },
         {
            "$project": bson.M{
               "_id":  1,
               "name": 1,
            },
         },
      },
      "as": "biz_name",
   },
})
// 打散biz_name数组为对象,并且保留空
query = append(query, bson.M{
   "$unwind": bson.M{
      "path": "$biz_name",
      "preserveNullAndEmptyArrays": true,
   },
})
query = append(query, bson.M{
   "$lookup": bson.M{
      "from": models.T_ShopOrderGoods,
      "let": bson.M{
         "rid": "$_id", //让主表的_id 命名为 rid
      },
      "pipeline": []bson.M{
         {
            "$match": bson.M{
               "$expr": bson.M{
                  "$eq": []string{"$order_id", "$$rid"}, //使得联表的 order_id == rid(主表的_id)
               },
            },
         },
         {
            "$project": bson.M{
               "goods_sn":   1,
               "goods_name": 1,
               "number":        1,
               "retail_price":        1,
            },
         },
      },
      "as": "goods",
   },
})

// pipeline 里面加 project

query = append(query,
   bson.M{"$lookup": bson.M{
      "from": models.T_User,
      "let": bson.M{
         "lid": "$linker_id",
      },
      "pipeline": []bson.M{
         {
            "$match": bson.M{
               "$expr": bson.M{
                  "$eq": []string{"$_id", "$$lid"}}},
         },
         {
            "$project": bson.M{
               "_id":            0,
               "nickname":       1,
               "mechanism_name": 1,
               "phone":          1,
               "gender":         1,
               "avatar":         1,
               "status":         1,
               "type":           1,
               "openid":         1},
         },
      },
      "as": "linker_info"}},
   bson.M{"$unwind": bson.M{
      "path": "$linker_info",
      "preserveNullAndEmptyArrays": true}},
)

//mongodb switch用法

query = append(query, bson.M{"$project": bson.M{
   "_id":          1,
   "user_id":      1,
   "goodList":     1,
   "order_status_text": bson.M{
      "$switch": bson.M{
         "branches": []bson.M{
            {
               "case": bson.M{"$eq": []interface{}{"$pay_status", 1}},
               "then": "未付款",
            },
            {
               "case": bson.M{"$eq": []interface{}{"$pay_status", 2}},
               "then": "已付款",
            },
            {
               "case": bson.M{"$eq": []interface{}{"$pay_status", 3}},
               "then": "退款成功",
            },
            {
               "case": bson.M{"$eq": []interface{}{"$pay_status", 4}},
               "then": "退款失败",
            },
         },
         "default": "null",
      },
   },
}})

// 分组 只取这些字段

query = append(query, bson.M{
   "$group": bson.M{
      "_id":                "$_id",
      "order_sn":         bson.M{"$first": "$order_sn"},
      "logistics_number": bson.M{"$first": "$logistics_number"},
      "pay_status_text":      bson.M{"$first": "$pay_status_text"},
      "actual_price":     bson.M{"$first": "$actual_price"},
      "nickname":  bson.M{"$first": "$buyer.nickname"},
      "mobile":      bson.M{"$first": "$mobile"},
      "address":   bson.M{"$last": "$address"},//只取匹配的最后一条,是个对象
      "remark":           bson.M{"$first": "$remark"},//只取匹配的第一条,是个对象
      "goods":          bson.M{"$push": "$goods"},//取匹配的所有,是个数组
   },
})

//create_date字段返回的时候处理成 "%Y-%m-%d,重命名为time

query = append(query, bson.M{"$project": bson.M{
   "_id":0,
   "asset_status": 1,
   "time":bson.M{"$dateToString":bson.M{"format": "%Y-%m-%d","date": "$create_date"}},
   "count": bson.M{"$sum": 1},
}})
query = append(query, bson.M{"$group": bson.M{
   "_id": bson.M{ "time": "$time","status": "$asset_status"},
   "count": bson.M{"$sum": 1},
   "asset_status": bson.M{"$first": "$asset_status"},
   "time": bson.M{"$first": "$time"},
}})
query = append(query, bson.M{"$sort": bson.M{ "time": -1}})

//project

query = append(query, bson.M{"$project": bson.M{
//_id 返回重命名为 id
"_id": 0, "id": "$_id", 
//code = $order.code
"code": "$order.code", "reason": "$order.reason",
//flow里的step结构只取以下字段
"flows": bson.M{"steps": bson.M{"cur": 1, "effect": 1, "name": 1, "next": 1}}})

//$addToSet:返回每个组的唯一表达式值的数组
//let:绑定要在指定表达式中使用的变量,并返回表达式的结果。

query := make([]map[string]interface{}, 0)
	query = append(query, bson.M{"$match": bson.M{"biz_id": bizID}})
	query = append(query, bson.M{"$unwind": "$selected"})
	query = append(query, bson.M{"$group": bson.M{
		"_id":    "$selected",
		"buyers": bson.M{"$addToSet": "$buyer_id"},
	}})
	query = append(query, bson.M{
		"$project": bson.M{
			"_id":         1,
			"buyers":      1,
			"buyer_count": bson.M{"$size": "$buyers"},
		},
	})
	query = append(query, bson.M{"$lookup": bson.M{
		"from": "t_role",
		"let":  bson.M{"buyers": "$buyers"},
		"pipeline": []bson.M{
			{"$match": bson.M{"$expr": bson.M{"$in": []string{"$_id", "$$buyers"}}}},
			{"$limit": 5},
			{"$skip": 0}},
		"as": "buyers",
	}})
//mongo语句
db.getCollection("t_order").aggregate([
    { $match: { biz_id: ObjectId("5e8d9e84447cef1576ae7fb9") } }, //条件
    { $unwind: "$selected" },//把seleted[]打散
    { $group: { _id: "$selected", buyers: { $addToSet: "$buyer_id" } } }, //先根据selected分组 再返回每一个selected 的buyer_id[] 命名为 buyers
    {
        $project: {
            _id: 1,
            buyers: 1,
            buyer_count: { $size: "$buyers" },//获取每一组buyers数组的长度
        },
    },
    {
        $lookup: {
            from: "t_role",
            let: { buyers: "$buyers" },  //绑定 变量 buyers == buyer_id[]
            pipeline: [ //$in查询role表里面有 buyers数组的role列表 取前5个
                {
                    $match: {
                        $expr: {
                            $in: ["$_id", "$$buyers"],
                        },
                    },
                },
                { $limit: 5 },
                { $skip: 0 },
            ],
            as: "buyers",
        },
    }
	 // ,{
    //     $project:{
    //         id:1,
    //         buyers: "$buyers.avatar", //只获取avatar字段
    //         buyer_count: { $size: "$buyers" }
    //     },
    // }
]);

//数据化初始化表:用户表

res := InitDbAndColl(session, mdb, models.T_User, GenJsonSchema(&models.User{}))
users := session.Database(mdb).Collection(models.T_User)
indexView := users.Indexes()
_, err = indexView.CreateMany(context.Background(), []mongo.IndexModel{
//创建索引
   {
      Keys: bsonx.Doc{{"nickname", bsonx.Int32(1)}},
   },
   {
      Keys: bsonx.Doc{{"phone", bsonx.Int32(1)}},
   },
   {
      Keys:    bsonx.Doc{{"openid", bsonx.Int32(1)}},
      Options: options.Index().SetUnique(true),//设置唯一索引
   },
   //复合索引 
   {
      Keys:    bsonx.Doc{{"role_id", bsonx.Int32(1)}, {"linker_id", bsonx.Int32(1)}, {"link_type", bsonx.Int32(1)}},
      Options: options.Index().SetUnique(true),
   },
})
if err != nil {
   log.Println(err)
}
log.Println(models.T_User, res["ok"])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值