使用 mongo go driver 查找集合中的所有文档
Find all documents in a collection with mongo go driver
我查看了答案 here,但这使用了旧的且未维护的 mgo。如何使用 mongo-go-driver 查找集合中的所有文档?
我尝试通过 nil
过滤器,但这不会 return 任何文档,而是 returns nil
。我还检查了 documentation 但没有看到任何提及 return 的所有文件。这是我尝试过的上述结果。
client, err := mongo.Connect(context.TODO(), "mongodb://localhost:27017")
coll := client.Database("test").Collection("albums")
if err != nil { fmt.Println(err) }
// we can assume we're connected...right?
fmt.Println("connected to mongodb")
var results []*Album
findOptions := options.Find()
cursor, err := coll.Find(context.TODO(), nil, findOptions)
if err != nil {
fmt.Println(err) // prints 'document is nil'
}
此外,我对为什么在调用集合上的 Find()
函数时需要指定 findOptions
感到困惑(或者我不需要指定?)。
尝试传递一个空的 bson.D
而不是 nil
:
cursor, err := coll.Find(context.TODO(), bson.D{})
此外,FindOptions
是可选的。
免责声明:我从未使用过官方驱动程序,但在 https://godoc.org/go.mongodb.org/mongo-driver/mongo
中有一些示例
好像他们的教程已经过时了:/
这是我使用 golang 的官方 MongoDB 驱动程序得出的结果。我正在使用 godotenv (https://github.com/joho/godotenv) 来传递数据库参数。
//Find multiple documents
func FindRecords() {
err := godotenv.Load()
if err != nil {
fmt.Println(err)
}
//Get database settings from env file
//dbUser := os.Getenv("db_username")
//dbPass := os.Getenv("db_pass")
dbName := os.Getenv("db_name")
docCollection := "retailMembers"
dbHost := os.Getenv("db_host")
dbPort := os.Getenv("db_port")
dbEngine := os.Getenv("db_type")
//set client options
clientOptions := options.Client().ApplyURI("mongodb://" + dbHost + ":" + dbPort)
//connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
//check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to " + dbEngine)
db := client.Database(dbName).Collection(docCollection)
//find records
//pass these options to the Find method
findOptions := options.Find()
//Set the limit of the number of record to find
findOptions.SetLimit(5)
//Define an array in which you can store the decoded documents
var results []Member
//Passing the bson.D{{}} as the filter matches documents in the collection
cur, err := db.Find(context.TODO(), bson.D{{}}, findOptions)
if err !=nil {
log.Fatal(err)
}
//Finding multiple documents returns a cursor
//Iterate through the cursor allows us to decode documents one at a time
for cur.Next(context.TODO()) {
//Create a value into which the single document can be decoded
var elem Member
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
results =append(results, elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
//Close the cursor once finished
cur.Close(context.TODO())
fmt.Printf("Found multiple documents: %+v\n", results)
}
我查看了答案 here,但这使用了旧的且未维护的 mgo。如何使用 mongo-go-driver 查找集合中的所有文档?
我尝试通过 nil
过滤器,但这不会 return 任何文档,而是 returns nil
。我还检查了 documentation 但没有看到任何提及 return 的所有文件。这是我尝试过的上述结果。
client, err := mongo.Connect(context.TODO(), "mongodb://localhost:27017")
coll := client.Database("test").Collection("albums")
if err != nil { fmt.Println(err) }
// we can assume we're connected...right?
fmt.Println("connected to mongodb")
var results []*Album
findOptions := options.Find()
cursor, err := coll.Find(context.TODO(), nil, findOptions)
if err != nil {
fmt.Println(err) // prints 'document is nil'
}
此外,我对为什么在调用集合上的 Find()
函数时需要指定 findOptions
感到困惑(或者我不需要指定?)。
尝试传递一个空的 bson.D
而不是 nil
:
cursor, err := coll.Find(context.TODO(), bson.D{})
此外,FindOptions
是可选的。
免责声明:我从未使用过官方驱动程序,但在 https://godoc.org/go.mongodb.org/mongo-driver/mongo
中有一些示例好像他们的教程已经过时了:/
这是我使用 golang 的官方 MongoDB 驱动程序得出的结果。我正在使用 godotenv (https://github.com/joho/godotenv) 来传递数据库参数。
//Find multiple documents
func FindRecords() {
err := godotenv.Load()
if err != nil {
fmt.Println(err)
}
//Get database settings from env file
//dbUser := os.Getenv("db_username")
//dbPass := os.Getenv("db_pass")
dbName := os.Getenv("db_name")
docCollection := "retailMembers"
dbHost := os.Getenv("db_host")
dbPort := os.Getenv("db_port")
dbEngine := os.Getenv("db_type")
//set client options
clientOptions := options.Client().ApplyURI("mongodb://" + dbHost + ":" + dbPort)
//connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {
log.Fatal(err)
}
//check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to " + dbEngine)
db := client.Database(dbName).Collection(docCollection)
//find records
//pass these options to the Find method
findOptions := options.Find()
//Set the limit of the number of record to find
findOptions.SetLimit(5)
//Define an array in which you can store the decoded documents
var results []Member
//Passing the bson.D{{}} as the filter matches documents in the collection
cur, err := db.Find(context.TODO(), bson.D{{}}, findOptions)
if err !=nil {
log.Fatal(err)
}
//Finding multiple documents returns a cursor
//Iterate through the cursor allows us to decode documents one at a time
for cur.Next(context.TODO()) {
//Create a value into which the single document can be decoded
var elem Member
err := cur.Decode(&elem)
if err != nil {
log.Fatal(err)
}
results =append(results, elem)
}
if err := cur.Err(); err != nil {
log.Fatal(err)
}
//Close the cursor once finished
cur.Close(context.TODO())
fmt.Printf("Found multiple documents: %+v\n", results)
}