mongodb 一次获得 10_000 行
mongodb getting 10_000 rows at a time
我试图在 mongodb 中一次获取 10000 个文档,但我得到了:
信息:
- Driver https://github.com/mongodb/mongo-go-driver
- opt.SetBatchSize(15_000)
- opt.SetAllowPartialResults(假)
- 时间戳索引
代码:
package main
import (
"context"
"fmt"
"net/http"
"os"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var database *mongo.Database
func main() {
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://20.20.20.43:27017"))
if err != nil {
panic(err)
}
database = client.Database("chat_data")
chatText := make([]chat, 0)
now := time.Now().Unix()
ctx, _ = context.WithTimeout(context.Background(), 30*time.Second)
// mongodb batch option
opt := options.Find()
opt.SetBatchSize(15_000)
opt.SetAllowPartialResults(false)
// mongodb filter
filter := bson.M{"timestamp": bson.M{"$gte": now - 108000}}
cur, err := database.Collection("chat").Find(ctx, filter, opt)
if err != nil {
// fmt.Fprint(w, err)
fmt.Println(err)
return
}
defer cur.Close(ctx)
for cur.Next(ctx) {
var result chat
err := cur.Decode(&result)
if err != nil {
fmt.Println(err)
continue
}
// do something with result....
// fmt.Println(result)
chatText = append(chatText, result)
}
if err := cur.Err(); err != nil {
// fmt.Fprint(w, cur.Err())
fmt.Println(err)
return
}
fmt.Println("done")
fmt.Println(len(chatText))
}
我可以用 mongodb 实现这个然后去 driver 吗?总是达到 30 秒超时
编辑 1
我在 python 中尝试(使用 pymongo)它只需要 0m2.159s
使用该过滤器查询 36k 文档
试试 7000,行不行就试 12000,不行就试 4000,以此类推
记下这些请求需要多长时间才能确定执行时间是否与批处理大小成正比。
您正在查询 timestamp
字段。如果您首先使用 timestamp
字段在该集合上创建索引,您应该会更快地获得结果,并在此过程中获得自由排序。
我试图在 mongodb 中一次获取 10000 个文档,但我得到了:
信息:
- Driver https://github.com/mongodb/mongo-go-driver
- opt.SetBatchSize(15_000)
- opt.SetAllowPartialResults(假)
- 时间戳索引
代码:
package main
import (
"context"
"fmt"
"net/http"
"os"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var database *mongo.Database
func main() {
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://20.20.20.43:27017"))
if err != nil {
panic(err)
}
database = client.Database("chat_data")
chatText := make([]chat, 0)
now := time.Now().Unix()
ctx, _ = context.WithTimeout(context.Background(), 30*time.Second)
// mongodb batch option
opt := options.Find()
opt.SetBatchSize(15_000)
opt.SetAllowPartialResults(false)
// mongodb filter
filter := bson.M{"timestamp": bson.M{"$gte": now - 108000}}
cur, err := database.Collection("chat").Find(ctx, filter, opt)
if err != nil {
// fmt.Fprint(w, err)
fmt.Println(err)
return
}
defer cur.Close(ctx)
for cur.Next(ctx) {
var result chat
err := cur.Decode(&result)
if err != nil {
fmt.Println(err)
continue
}
// do something with result....
// fmt.Println(result)
chatText = append(chatText, result)
}
if err := cur.Err(); err != nil {
// fmt.Fprint(w, cur.Err())
fmt.Println(err)
return
}
fmt.Println("done")
fmt.Println(len(chatText))
}
我可以用 mongodb 实现这个然后去 driver 吗?总是达到 30 秒超时
编辑 1
我在 python 中尝试(使用 pymongo)它只需要 0m2.159s
使用该过滤器查询 36k 文档
试试 7000,行不行就试 12000,不行就试 4000,以此类推
记下这些请求需要多长时间才能确定执行时间是否与批处理大小成正比。
您正在查询 timestamp
字段。如果您首先使用 timestamp
字段在该集合上创建索引,您应该会更快地获得结果,并在此过程中获得自由排序。