From d054de9c6d8c00c24180cd5e47f104459e2488a7 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Fri, 17 Nov 2023 17:42:33 +0800 Subject: [PATCH] mongo --- pkg/common/db/newmgo/conversation.go | 10 +++--- pkg/common/db/newmgo/group_member.go | 8 ++--- pkg/common/db/newmgo/mgotool/tool.go | 47 +++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/pkg/common/db/newmgo/conversation.go b/pkg/common/db/newmgo/conversation.go index dbe6eef7c..cfa22d08f 100644 --- a/pkg/common/db/newmgo/conversation.go +++ b/pkg/common/db/newmgo/conversation.go @@ -47,11 +47,11 @@ func (c *ConversationMgo) Find(ctx context.Context, ownerUserID string, conversa } func (c *ConversationMgo) FindUserID(ctx context.Context, userIDs []string, conversationIDs []string) ([]string, error) { - return mgotool.Find[string](ctx, c.coll, bson.M{"owner_user_id": bson.M{"$in": userIDs}, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"owner_user_id": 1})) + return mgotool.Find[string](ctx, c.coll, bson.M{"owner_user_id": bson.M{"$in": userIDs}, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) } func (c *ConversationMgo) FindUserIDAllConversationID(ctx context.Context, userID string) ([]string, error) { - return mgotool.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID}, options.Find().SetProjection(bson.M{"conversation_id": 1})) + return mgotool.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "conversation_id": 1})) } func (c *ConversationMgo) Take(ctx context.Context, userID, conversationID string) (conversation *relation.ConversationModel, err error) { @@ -59,7 +59,7 @@ func (c *ConversationMgo) Take(ctx context.Context, userID, conversationID strin } func (c *ConversationMgo) FindConversationID(ctx context.Context, userID string, conversationIDs []string) (existConversationID []string, err error) { - return mgotool.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"conversation_id": 1})) + return mgotool.Find[string](ctx, c.coll, bson.M{"owner_user_id": userID, "conversation_id": bson.M{"$in": conversationIDs}}, options.Find().SetProjection(bson.M{"_id": 0, "conversation_id": 1})) } func (c *ConversationMgo) FindUserIDAllConversations(ctx context.Context, userID string) (conversations []*relation.ConversationModel, err error) { @@ -67,7 +67,7 @@ func (c *ConversationMgo) FindUserIDAllConversations(ctx context.Context, userID } func (c *ConversationMgo) FindRecvMsgNotNotifyUserIDs(ctx context.Context, groupID string) ([]string, error) { - return mgotool.Find[string](ctx, c.coll, bson.M{"group_id": groupID, "recv_msg_opt": constant.ReceiveNotNotifyMessage}, options.Find().SetProjection(bson.M{"owner_user_id": 1})) + return mgotool.Find[string](ctx, c.coll, bson.M{"group_id": groupID, "recv_msg_opt": constant.ReceiveNotNotifyMessage}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) } func (c *ConversationMgo) GetUserRecvMsgOpt(ctx context.Context, ownerUserID, conversationID string) (opt int, err error) { @@ -125,5 +125,5 @@ func (c *ConversationMgo) GetConversationIDsNeedDestruct(ctx context.Context) ([ } func (c *ConversationMgo) GetConversationNotReceiveMessageUserIDs(ctx context.Context, conversationID string) ([]string, error) { - return mgotool.Find[string](ctx, c.coll, bson.M{"conversation_id": conversationID, "recv_msg_opt": bson.M{"$ne": constant.ReceiveMessage}}, options.Find().SetProjection(bson.M{"owner_user_id": 1})) + return mgotool.Find[string](ctx, c.coll, bson.M{"conversation_id": conversationID, "recv_msg_opt": bson.M{"$ne": constant.ReceiveMessage}}, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1})) } diff --git a/pkg/common/db/newmgo/group_member.go b/pkg/common/db/newmgo/group_member.go index 2c2f96ba6..dbc774e80 100644 --- a/pkg/common/db/newmgo/group_member.go +++ b/pkg/common/db/newmgo/group_member.go @@ -41,7 +41,7 @@ func (g *GroupMemberMgo) Find(ctx context.Context, groupIDs []string, userIDs [] } func (g *GroupMemberMgo) FindMemberUserID(ctx context.Context, groupID string) (userIDs []string, err error) { - return mgotool.Find[string](ctx, g.coll, bson.M{"group_id": groupID}, options.Find().SetProjection(bson.M{"user_id": 1})) + return mgotool.Find[string](ctx, g.coll, bson.M{"group_id": groupID}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1})) } func (g *GroupMemberMgo) Take(ctx context.Context, groupID string, userID string) (groupMember *relation.GroupMemberModel, err error) { @@ -53,7 +53,7 @@ func (g *GroupMemberMgo) TakeOwner(ctx context.Context, groupID string) (groupMe } func (g *GroupMemberMgo) FindRoleLevelUserIDs(ctx context.Context, groupID string, roleLevel int32) ([]string, error) { - return mgotool.Find[string](ctx, g.coll, bson.M{"group_id": groupID, "role_level": roleLevel}, options.Find().SetProjection(bson.M{"user_id": 1})) + return mgotool.Find[string](ctx, g.coll, bson.M{"group_id": groupID, "role_level": roleLevel}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1})) } func (g *GroupMemberMgo) SearchMember(ctx context.Context, keyword string, groupID string, pagination pagination.Pagination) (total int64, groupList []*relation.GroupMemberModel, err error) { @@ -62,7 +62,7 @@ func (g *GroupMemberMgo) SearchMember(ctx context.Context, keyword string, group } func (g *GroupMemberMgo) FindUserJoinedGroupID(ctx context.Context, userID string) (groupIDs []string, err error) { - return mgotool.Find[string](ctx, g.coll, bson.M{"user_id": userID}, options.Find().SetProjection(bson.M{"group_id": 1})) + return mgotool.Find[string](ctx, g.coll, bson.M{"user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1})) } func (g *GroupMemberMgo) TakeGroupMemberNum(ctx context.Context, groupID string) (count int64, err error) { @@ -76,7 +76,7 @@ func (g *GroupMemberMgo) FindUserManagedGroupID(ctx context.Context, userID stri "$in": []int{constant.GroupOwner, constant.GroupAdmin}, }, } - return mgotool.Find[string](ctx, g.coll, filter, options.Find().SetProjection(bson.M{"group_id": 1})) + return mgotool.Find[string](ctx, g.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1})) } func (g *GroupMemberMgo) IsUpdateRoleLevel(data map[string]any) bool { diff --git a/pkg/common/db/newmgo/mgotool/tool.go b/pkg/common/db/newmgo/mgotool/tool.go index 01177edba..4feb48833 100644 --- a/pkg/common/db/newmgo/mgotool/tool.go +++ b/pkg/common/db/newmgo/mgotool/tool.go @@ -8,7 +8,30 @@ import ( "go.mongodb.org/mongo-driver/mongo/options" ) -func Anys[T any](ts []T) []any { +func basic[T any]() bool { + var t T + switch any(t).(type) { + case int: + case int8: + case int16: + case int32: + case int64: + case uint: + case uint8: + case uint16: + case uint32: + case uint64: + case float32: + case float64: + case string: + case []byte: + default: + return false + } + return true +} + +func anes[T any](ts []T) []any { val := make([]any, len(ts)) for i := range ts { val[i] = ts[i] @@ -30,7 +53,7 @@ func findOptionToCountOption(opts []*options.FindOptions) *options.CountOptions } func InsertMany[T any](ctx context.Context, coll *mongo.Collection, val []T, opts ...*options.InsertManyOptions) error { - _, err := coll.InsertMany(ctx, Anys(val), opts...) + _, err := coll.InsertMany(ctx, anes(val), opts...) if err != nil { return errs.Wrap(err) } @@ -63,8 +86,24 @@ func Find[T any](ctx context.Context, coll *mongo.Collection, filter any, opts . } defer cur.Close(ctx) var res []T - if err := cur.All(ctx, &res); err != nil { - return nil, errs.Wrap(err) + if basic[T]() { + var temp []map[string]T + if err := cur.All(ctx, &temp); err != nil { + return nil, errs.Wrap(err) + } + res = make([]T, 0, len(temp)) + for _, m := range temp { + if len(m) != 1 { + return nil, errs.ErrInternalServer.Wrap("mongo find result len(m) != 1") + } + for _, t := range m { + res = append(res, t) + } + } + } else { + if err := cur.All(ctx, &res); err != nil { + return nil, errs.Wrap(err) + } } return res, nil }