From eab621e06d8d2d21d9426eb64ad37ae3337927af Mon Sep 17 00:00:00 2001 From: libo Date: Fri, 7 Jun 2024 10:55:26 +0800 Subject: [PATCH] Use 'seqSuffix' to sort MsgDocModel in GetMsgDocModelByIndex --- pkg/common/storage/database/mgo/msg.go | 44 ++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/pkg/common/storage/database/mgo/msg.go b/pkg/common/storage/database/mgo/msg.go index a7291fcc8..829561f5c 100644 --- a/pkg/common/storage/database/mgo/msg.go +++ b/pkg/common/storage/database/mgo/msg.go @@ -204,9 +204,47 @@ func (m *MsgMgo) GetMsgDocModelByIndex(ctx context.Context, conversationID strin if sort != 1 && sort != -1 { return nil, errs.ErrArgs.WrapMsg("mongo sort must be 1 or -1") } - opt := options.Find().SetLimit(1).SetSkip(index).SetSort(bson.M{"doc_id": sort}).SetLimit(1) - filter := bson.M{"doc_id": primitive.Regex{Pattern: fmt.Sprintf("^%s:", conversationID)}} - msgs, err := mongoutil.Find[*model.MsgDocModel](ctx, m.coll, filter, opt) + + // 构建聚合管道 + pipeline := mongo.Pipeline{ + {{ + "$match", bson.D{ + {"doc_id", bson.M{"$regex": fmt.Sprintf("^%s:", conversationID)}}, + }, + }}, + {{ + "$project", bson.M{ + "doc_id": 1, + "seqSuffix": bson.M{ // 创建一个新字段来存储转换后的 seqSuffix 整数 + "$toInt": bson.M{ // $toInt 表达式 + "$arrayElemAt": bson.A{ // $arrayElemAt 需要一个数组作为第一个参数 + bson.M{"$split": []interface{}{"$doc_id", ":"}}, // $split 表达式 + -1, // 索引,取数组的最后一个元素 + }, + }, + }, + "msgs": 1, + }, + }}, + {{ + "$sort", bson.D{ // 按 seqSuffix 排序 + {"seqSuffix", sort}, + }, + }}, + } + + // 如果需要分页,可以在这里添加逻辑来动态地修改 pipeline + if index > 0 { + pipeline = append(pipeline, bson.D{{ + "$skip", index, + }}) + } + pipeline = append(pipeline, bson.D{{ + "$limit", 1, // 我们只需要一个文档 + }}) + + // 执行聚合查询 + msgs, err := mongoutil.Aggregate[*model.MsgDocModel](ctx, m.coll, pipeline) if err != nil { return nil, err }