diff --git a/pkg/common/db/controller/msg_test.go b/pkg/common/db/controller/msg_test.go index e76da93c4..3d1f117cd 100644 --- a/pkg/common/db/controller/msg_test.go +++ b/pkg/common/db/controller/msg_test.go @@ -2,6 +2,7 @@ package controller import ( "context" + "encoding/json" "fmt" "math/rand" "strconv" @@ -185,17 +186,28 @@ func Test_Revoke(t *testing.T) { } } -// func Test_Delete(t *testing.T) { -// db := GetDB() -// ctx := context.Background() -// var arr []any -// for i := 0; i < 123; i++ { -// arr = append(arr, []string{"uid_1", "uid_2"}) -// } -// if err := db.BatchInsertBlock(ctx, "test", arr, "", 210); err != nil { -// t.Fatal(err) -// } -// } +func Test_FindBySeq(t *testing.T) { + db := GetDB() + ctx := context.Background() + res, err := db.msgDocDatabase.GetMsgBySeqIndexIn1Doc(ctx, "123456", "test:0", []int64{1, 2, 3}) + if err != nil { + t.Fatal(err) + } + data, _ := json.Marshal(res) + fmt.Println(string(data)) +} + +//func Test_Delete(t *testing.T) { +// db := GetDB() +// ctx := context.Background() +// var arr []any +// for i := 0; i < 123; i++ { +// arr = append(arr, []string{"uid_1", "uid_2"}) +// } +// if err := db.BatchInsertBlock(ctx, "test", arr, updateKeyDel, 210); err != nil { +// t.Fatal(err) +// } +//} //func Test_Delete1(t *testing.T) { // config.Config.Mongo.DBAddress = []string{"192.168.44.128:37017"} diff --git a/pkg/common/db/unrelation/msg.go b/pkg/common/db/unrelation/msg.go index a3de6d414..75d888105 100644 --- a/pkg/common/db/unrelation/msg.go +++ b/pkg/common/db/unrelation/msg.go @@ -6,7 +6,6 @@ import ( "fmt" table "github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/unrelation" - "github.com/OpenIMSDK/Open-IM-Server/pkg/common/log" "github.com/OpenIMSDK/Open-IM-Server/pkg/errs" "github.com/OpenIMSDK/Open-IM-Server/pkg/proto/sdkws" "github.com/OpenIMSDK/Open-IM-Server/pkg/utils" @@ -178,47 +177,66 @@ func (m *MsgMongoDriver) DeleteDocs(ctx context.Context, docIDs []string) error return err } -func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, userID, docID string, seqs []int64) (msgs []*table.MsgInfoModel, err error) { - beginSeq, endSeq := utils.GetSeqsBeginEnd(seqs) - beginIndex := m.model.GetMsgIndex(beginSeq) - num := endSeq - beginSeq + 1 - log.ZInfo(ctx, "GetMsgBySeqIndexIn1Doc", "docID", docID, "seqs", seqs, "beginSeq", beginSeq, "endSeq", endSeq, "beginIndex", beginIndex, "num", num) - pipeline := bson.A{ - bson.M{ - "$match": bson.M{"doc_id": docID}, +func (m *MsgMongoDriver) GetMsgBySeqIndexIn1Doc(ctx context.Context, userID string, docID string, seqs []int64) (msgs []*table.MsgInfoModel, err error) { + indexs := make([]int64, 0, len(seqs)) + for _, seq := range seqs { + indexs = append(indexs, m.model.GetMsgIndex(seq)) + } + pipeline := mongo.Pipeline{ + { + {"$match", bson.D{ + {"doc_id", docID}, + }}, }, - bson.M{ - "$project": bson.M{ - "msgs": bson.M{ - "$slice": bson.A{"$msgs", beginIndex, num}, - }, - }, + { + {"$project", bson.D{ + {"_id", 0}, + {"msgs", bson.D{ + {"$map", bson.D{ + {"input", indexs}, + {"as", "index"}, + {"in", bson.D{ + {"$let", bson.D{ + {"vars", bson.D{ + {"currentMsg", bson.D{ + {"$arrayElemAt", []string{"$msgs", "$$index"}}, + }}, + }}, + {"in", bson.D{ + {"$cond", bson.D{ + {"if", bson.D{ + {"$in", []string{userID, "$$currentMsg.del_list"}}, + }}, + {"then", nil}, + {"else", "$$currentMsg"}, + }}, + }}, + }}, + }}, + }}, + }}, + }}, + }, + { + {"$project", bson.D{ + {"doc_id", 0}, + {"msgs.del_list", 0}, + }}, }, } - cursor, err := m.MsgCollection.Aggregate(ctx, pipeline) + cur, err := m.MsgCollection.Aggregate(ctx, pipeline) if err != nil { return nil, errs.Wrap(err) } - defer cursor.Close(ctx) - var doc table.MsgDocModel - if cursor.Next(ctx) { - if err := cursor.Decode(&doc); err != nil { - return nil, err - } + defer cur.Close(ctx) + var msgDocModel []table.MsgDocModel + if err := cur.All(ctx, &msgDocModel); err != nil { + return nil, errs.Wrap(err) } - log.ZDebug(ctx, "msgInfos", "num", len(doc.Msg), "docID", docID) - for _, v := range doc.Msg { - if v.Msg == nil { - continue - } - if v.Msg.Seq >= beginSeq && v.Msg.Seq <= endSeq { - log.ZDebug(ctx, "find msg", "msg", v.Msg) - msgs = append(msgs, v) - } else { - log.ZWarn(ctx, "this msg is at wrong position", nil, "msg", v.Msg) - } + if len(msgDocModel) == 0 { + return nil, errs.Wrap(mongo.ErrNoDocuments) } - return msgs, nil + return msgDocModel[0].Msg, nil } func (m *MsgMongoDriver) IsExistDocID(ctx context.Context, docID string) (bool, error) {