# 连接数据库
- 打开 sshtunnel
- 获取 client
# 获得 collection
func GetNpmRecords() *mongo.Collection { | |
client := MgoCli() | |
db := client.Database("admin") | |
s, _ := db.ListCollectionNames(context.TODO(), bson.M{}) | |
fmt.Printf("s: %v\n", s) | |
npm_records := db.Collection("npm_records") | |
return npm_records | |
} |
# 查询
# 通过 struct 进行关联
func CursorTest() { | |
npm_records := GetNpmRecords() | |
sqlstr := `[{"$match":{"name":"response-json-formatter"}}, | |
{"$project":{"name":1, "version":1}}, | |
{"$limit":5} | |
]` | |
var bdoc interface{} | |
err2 := bson.UnmarshalExtJSON([]byte(sqlstr), true, &bdoc) | |
fmt.Printf("err2: %v\n", err2) | |
fmt.Printf("bdoc: %v\n", bdoc) | |
cursor, err := npm_records.Aggregate(context.TODO(), bdoc) | |
if err != nil { | |
log.Fatal(err) | |
} | |
defer cursor.Close(context.TODO()) | |
tmp := struct { | |
Name string `bson:"name"` | |
Version string `bson:"version"` | |
}{} | |
for cursor.Next(context.TODO()) { | |
cursor.Decode(&tmp) | |
fmt.Println(tmp) | |
} | |
} |
核心命令是 bson.UnmarshalExtJSON([]byte(sqlstr), true, &bdoc)
,将查询的 SQL 语句转换为 bson
。
然后直接调用 Aggregate
进行查询。
# 获取 bson 结果
func CursorTest() { | |
npm_records := GetNpmRecords() | |
sqlstr := `[{"$match":{"name":"response-json-formatter"}}, | |
{"$project":{"name":1, "version":1}}, | |
{"$limit":5} | |
]` | |
var bdoc interface{} | |
err2 := bson.UnmarshalExtJSON([]byte(sqlstr), true, &bdoc) | |
fmt.Printf("err2: %v\n", err2) | |
fmt.Printf("bdoc: %v\n", bdoc) | |
cursor, err := npm_records.Aggregate(context.TODO(), bdoc) | |
if err != nil { | |
log.Fatal(err) | |
} | |
defer cursor.Close(context.TODO()) | |
var results []bson.M // 定义 bson | |
cursor.All(context.TODO(), &results) // 然后 ALL | |
for _, res := range results { | |
fmt.Println(res) | |
} | |
b, _ := bson.MarshalExtJSON(&results, true, true) | |
fmt.Printf("b: %v\n", b) | |
// mongo.Pipeline{bson.D(bdoc)} | |
} |
# 总结
通过游标方式可以获取一个个的数据,但是如何一次性获得数据后,处理并保存。。。。
这里做了一个实验:
for cursor.Next(context.TODO()) { | |
wg.Add(1) | |
go func() { | |
cursor.Decode(&tmp) | |
fmt.Println(tmp) | |
defer wg.Done() | |
}() | |
} |
读 10000 个数据,使用了并发和没使用并发耗时根本没区别。。。。
Decode 不是限制性能原因吧。。。