乐于分享
好东西不私藏

Go操作MongoDB:文档数据库实战

Go操作MongoDB:文档数据库实战

第一次用 MongoDB 的时候,我还在想:这不就是一个 JSON 数据库吗,有什么难的?结果真正用到项目里才发现,schema 灵活是优点也是坑。有一次同事把一个字段从字符串改成了数字,老数据还是字符串,新数据变成了数字,查询的时候类型不匹配,死活查不出来,排查了半天才发现是历史数据类型不一致的问题。

MongoDB 适合那种结构不固定、可能频繁变化的数据。比如用户画像,今天加个字段,明天改个类型,用 MySQL 得 alter table,用 MongoDB 直接塞就行。下面聊聊 Go 里怎么操作 MongoDB,以及我踩过的一些坑。

连接与基础配置

官方驱动 mongo-driver 已经挺成熟了,连接代码很简单:

package main

import (
"context"
"fmt"
"time"

"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)

type MongoDB struct {
 client   *mongo.Client
 database *mongo.Database
}

funcNewMongoDB(uri, dbName string)(*MongoDB, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 clientOptions := options.Client().
  ApplyURI(uri).
  SetMaxPoolSize(100).
  SetMinPoolSize(10).
  SetMaxConnIdleTime(30 * time.Second)

 client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
returnnil, err
 }

if err := client.Ping(ctx, readpref.Primary()); err != nil {
returnnil, err
 }

 fmt.Println("MongoDB 连接成功")
return &MongoDB{
  client:   client,
  database: client.Database(dbName),
 }, nil
}

func(m *MongoDB)Close()error {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return m.client.Disconnect(ctx)
}

func(m *MongoDB)Collection(name string) *mongo.Collection {
return m.database.Collection(name)
}

连接池参数根据实际并发量调整。我们线上一个服务 QPS 几千,MaxPoolSize 设到 200 才够用。如果连接池太小,高并发下会出现 connection pool exhausted 错误。

数据模型设计

MongoDB 的文档模型设计是个学问。嵌套还是引用?取决于查询模式。如果每次查用户都要带 profile,那就嵌套;如果 profile 数据量很大且不是每次都需要,就分开存。

package model

import (
"time"

"go.mongodb.org/mongo-driver/bson/primitive"
)

type User struct {
 ID        primitive.ObjectID `bson:"_id,omitempty" json:"id"`
 Username  string`bson:"username" json:"username"`
 Email     string`bson:"email" json:"email"`
 Password  string`bson:"password" json:"-"`
 Profile   UserProfile        `bson:"profile" json:"profile"`
 Tags      []string`bson:"tags" json:"tags"`
 Status    int`bson:"status" json:"status"`
 CreatedAt time.Time          `bson:"created_at" json:"created_at"`
 UpdatedAt time.Time          `bson:"updated_at" json:"updated_at"`
}

type UserProfile struct {
 Nickname string`bson:"nickname" json:"nickname"`
 Avatar   string`bson:"avatar" json:"avatar"`
 Gender   int`bson:"gender" json:"gender"`
 Age      int`bson:"age" json:"age"`
 City     string`bson:"city" json:"city"`
}

type Article struct {
 ID        primitive.ObjectID `bson:"_id,omitempty" json:"id"`
 Title     string`bson:"title" json:"title"`
 Content   string`bson:"content" json:"content"`
 AuthorID  primitive.ObjectID `bson:"author_id" json:"author_id"`
 Tags      []string`bson:"tags" json:"tags"`
 ViewCount int`bson:"view_count" json:"view_count"`
 LikeCount int`bson:"like_count" json:"like_count"`
 Comments  []Comment          `bson:"comments" json:"comments"`
 Status    int`bson:"status" json:"status"`
 CreatedAt time.Time          `bson:"created_at" json:"created_at"`
 UpdatedAt time.Time          `bson:"updated_at" json:"updated_at"`
}

type Comment struct {
 ID        primitive.ObjectID `bson:"_id,omitempty" json:"id"`
 UserID    primitive.ObjectID `bson:"user_id" json:"user_id"`
 Content   string`bson:"content" json:"content"`
 CreatedAt time.Time          `bson:"created_at" json:"created_at"`
}

primitive.ObjectID 是 MongoDB 的默认 ID 类型,占 12 字节,包含时间戳信息,按 _id 排序天然就是按创建时间排序。如果你有自己的 ID 生成策略(比如雪花算法),也可以不用 ObjectID。

CRUD 操作

封装一个 Repository 层,把常用操作包起来:

package repository

import (
"context"
"time"

"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)

type UserRepository struct {
 collection *mongo.Collection
}

funcNewUserRepository(db *MongoDB) *UserRepository {
return &UserRepository{collection: db.Collection("users")}
}

// 创建
func(r *UserRepository)Create(user *User)error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

 user.CreatedAt = time.Now()
 user.UpdatedAt = time.Now()

 result, err := r.collection.InsertOne(ctx, user)
if err != nil {
return err
 }
 user.ID = result.InsertedID.(primitive.ObjectID)
returnnil
}

// 批量创建
func(r *UserRepository)CreateMany(users []User)error {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 docs := make([]interface{}, len(users))
for i := range users {
  users[i].CreatedAt = time.Now()
  users[i].UpdatedAt = time.Now()
  docs[i] = users[i]
 }
 _, err := r.collection.InsertMany(ctx, docs)
return err
}

// 根据 ID 查询
func(r *UserRepository)FindByID(id primitive.ObjectID)(*User, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

var user User
 err := r.collection.FindOne(ctx, bson.M{"_id": id}).Decode(&user)
if err != nil {
returnnil, err
 }
return &user, nil
}

// 根据用户名查询
func(r *UserRepository)FindByUsername(username string)(*User, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

var user User
 err := r.collection.FindOne(ctx, bson.M{"username": username}).Decode(&user)
if err != nil {
returnnil, err
 }
return &user, nil
}

// 分页查询
func(r *UserRepository)FindAll(page, pageSize int)([]User, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 skip := int64((page - 1) * pageSize)
 limit := int64(pageSize)

 opts := options.Find().
  SetSkip(skip).
  SetLimit(limit).
  SetSort(bson.D{{"created_at"-1}})

 cursor, err := r.collection.Find(ctx, bson.M{}, opts)
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var users []User
if err := cursor.All(ctx, &users); err != nil {
returnnil, err
 }
return users, nil
}

// 条件查询(带总数)
func(r *UserRepository)FindByCondition(filter bson.M, page, pageSize int)([]User, int64, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 total, err := r.collection.CountDocuments(ctx, filter)
if err != nil {
returnnil0, err
 }

 skip := int64((page - 1) * pageSize)
 limit := int64(pageSize)
 opts := options.Find().SetSkip(skip).SetLimit(limit).SetSort(bson.D{{"created_at"-1}})

 cursor, err := r.collection.Find(ctx, filter, opts)
if err != nil {
returnnil0, err
 }
defer cursor.Close(ctx)

var users []User
if err := cursor.All(ctx, &users); err != nil {
returnnil0, err
 }
return users, total, nil
}

更新操作注意 $set 和 $inc 的区别:

// 更新用户
func(r *UserRepository)Update(id primitive.ObjectID, update bson.M)error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

 update["updated_at"] = time.Now()
 _, err := r.collection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{"$set": update})
return err
}

// 自增字段
func(r *UserRepository)Increment(id primitive.ObjectID, field string, value int)error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

 _, err := r.collection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{
"$inc": bson.M{field: value},
"$set": bson.M{"updated_at": time.Now()},
 })
return err
}

// 数组操作
func(r *UserRepository)AddToArray(id primitive.ObjectID, field string, value interface{})error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

 _, err := r.collection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{
"$push": bson.M{field: value},
"$set":  bson.M{"updated_at": time.Now()},
 })
return err
}

func(r *UserRepository)RemoveFromArray(id primitive.ObjectID, field string, value interface{})error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

 _, err := r.collection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{
"$pull": bson.M{field: value},
"$set":  bson.M{"updated_at": time.Now()},
 })
return err
}

// 删除
func(r *UserRepository)Delete(id primitive.ObjectID)error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
 _, err := r.collection.DeleteOne(ctx, bson.M{"_id": id})
return err
}

// 软删除
func(r *UserRepository)SoftDelete(id primitive.ObjectID)error {
 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

 _, err := r.collection.UpdateOne(ctx, bson.M{"_id": id}, bson.M{"$set": bson.M{
"status":     -1,
"deleted_at": time.Now(),
"updated_at": time.Now(),
 }})
return err
}

复杂查询

MongoDB 的查询语法比 SQL 灵活,但也更容易写错:

// 多条件查询
func(r *UserRepository)SearchUsers(keyword string, status int, tags []string)([]User, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 filter := bson.M{}
if keyword != "" {
  filter["$or"] = []bson.M{
   {"username": bson.M{"$regex": keyword, "$options""i"}},
   {"email": bson.M{"$regex": keyword, "$options""i"}},
  }
 }
if status >= 0 {
  filter["status"] = status
 }
iflen(tags) > 0 {
  filter["tags"] = bson.M{"$in": tags}
 }

 cursor, err := r.collection.Find(ctx, filter)
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var users []User
if err := cursor.All(ctx, &users); err != nil {
returnnil, err
 }
return users, nil
}

// 范围查询
func(r *UserRepository)FindByAgeRange(minAge, maxAge int)([]User, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 filter := bson.M{
"profile.age": bson.M{
"$gte": minAge,
"$lte": maxAge,
  },
 }

 cursor, err := r.collection.Find(ctx, filter)
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var users []User
if err := cursor.All(ctx, &users); err != nil {
returnnil, err
 }
return users, nil
}

// 嵌套文档查询
func(r *UserRepository)FindByCity(city string)([]User, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 cursor, err := r.collection.Find(ctx, bson.M{"profile.city": city})
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var users []User
if err := cursor.All(ctx, &users); err != nil {
returnnil, err
 }
return users, nil
}

// 投影查询(只返回指定字段)
func(r *UserRepository)FindUsernamesOnly()([]bson.M, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 opts := options.Find().SetProjection(bson.M{
"username"1,
"email":    1,
"_id":      0,
 })

 cursor, err := r.collection.Find(ctx, bson.M{}, opts)
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var results []bson.M
if err := cursor.All(ctx, &results); err != nil {
returnnil, err
 }
return results, nil
}

简单聚合

聚合管道是 MongoDB 的强项,基础的统计很简单:

// 按状态统计用户数量
func(r *UserRepository)CountByStatus()([]bson.M, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 pipeline := mongo.Pipeline{
  {{"$group", bson.D{
   {"_id""$status"},
   {"count", bson.D{{"$sum"1}}},
  }}},
  {{"$sort", bson.D{{"count"-1}}}},
 }

 cursor, err := r.collection.Aggregate(ctx, pipeline)
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var results []bson.M
if err := cursor.All(ctx, &results); err != nil {
returnnil, err
 }
return results, nil
}

// 按城市统计
func(r *UserRepository)CountByCity()([]bson.M, error) {
 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

 pipeline := mongo.Pipeline{
  {{"$group", bson.D{
   {"_id""$profile.city"},
   {"count", bson.D{{"$sum"1}}},
   {"avg_age", bson.D{{"$avg""$profile.age"}}},
  }}},
  {{"$sort", bson.D{{"count"-1}}}},
  {{"$limit"10}},
 }

 cursor, err := r.collection.Aggregate(ctx, pipeline)
if err != nil {
returnnil, err
 }
defer cursor.Close(ctx)

var results []bson.M
if err := cursor.All(ctx, &results); err != nil {
returnnil, err
 }
return results, nil
}

几个容易踩的坑

类型不一致。MongoDB 是弱类型的,同一个字段在不同文档里可以是不同类型。查询时 bson.M{"age": 18} 匹配不到 age 是 "18"(字符串)的文档。建议写数据时做类型校验,或者查询时用 $type 过滤。

ObjectID 的时间精度。ObjectID 包含秒级时间戳,不要用它来做需要毫秒精度的排序。如果有高并发写入,同一秒内生成的 ObjectID 排序顺序不保证和写入顺序完全一致。

数组更新原子性$push 和 $pull 是原子操作,但如果数组很大(比如几万条评论),更新性能会很差。建议数组控制在几百条以内,超了就拆分到单独的 collection。

默认连接超时mongo.Connect 默认没有超时,网络不通时会一直卡着。一定要加 context.WithTimeout

忽略游标关闭Find 返回的 cursor 一定要 defer cursor.Close(),否则连接泄漏。我们线上就出现过因为没关 cursor 导致连接池耗尽的情况。

CountDocuments 慢。大数据量下 CountDocuments 会很慢,因为它要扫描匹配的所有文档。如果只需要估算值,用 EstimatedDocumentCount。或者自己维护一个计数器 collection。


MongoDB 用好了很爽,schema 灵活、查询丰富、水平扩展方便。但如果把它当 MySQL 用,什么关系都嵌套、什么字段都建索引,后面维护起来会很痛苦。设计文档模型时多想想查询模式,按查询模式来反推存储结构。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-17 04:24:01 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/859900.html
  2. 运行时间 : 0.132286s [ 吞吐率:7.56req/s ] 内存消耗:4,676.90kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c513754509b8b4d0b0ae5ccabb581d21
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000647s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000783s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000365s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000254s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000475s ]
  6. SELECT * FROM `set` [ RunTime:0.000212s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000586s ]
  8. SELECT * FROM `article` WHERE `id` = 859900 LIMIT 1 [ RunTime:0.003636s ]
  9. UPDATE `article` SET `lasttime` = 1784233441 WHERE `id` = 859900 [ RunTime:0.031980s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000425s ]
  11. SELECT * FROM `article` WHERE `id` < 859900 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002382s ]
  12. SELECT * FROM `article` WHERE `id` > 859900 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001102s ]
  13. SELECT * FROM `article` WHERE `id` < 859900 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000844s ]
  14. SELECT * FROM `article` WHERE `id` < 859900 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.006739s ]
  15. SELECT * FROM `article` WHERE `id` < 859900 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000789s ]
0.134082s