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"])
704

被折叠的 条评论
为什么被折叠?



