# 连接数据库

  1. 打开 sshtunnel
  2. 获取 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 不是限制性能原因吧。。。

更新于

请我喝[茶]~( ̄▽ ̄)~*

Kalice 微信支付

微信支付

Kalice 支付宝

支付宝