web-dev-qa-db-ja.com

mongo goドライバーを使用してコレクション内のすべてのドキュメントを検索する

私は答えをチェックアウトしました here が、これは古いメンテナンスされていないmgoを使用します。 mongo-go-driverを使用してコレクション内のすべてのドキュメントを検索するにはどうすればよいですか?

nilフィルターを渡そうとしましたが、これはドキュメントを返さず、代わりにnilを返します。 documentation もチェックしましたが、すべてのドキュメントを返すことについての言及はありませんでした。これが前述の結果で試したものです。

_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を指定する必要がある理由について混乱しています(または指定する必要はありませんか?)。

4
Kelly Flet

nilの代わりに空の_bson.D_を渡してみてください:

_cursor, err := coll.Find(context.TODO(), bson.D{})
_

また、FindOptionsはオプションです。

免責事項:私は公式ドライバーを使用したことがありませんが、いくつかの例が https://godoc.org/go.mongodb.org/mongo-driver/mongo にあります

彼らのチュートリアルは時代遅れのようです:/

3
Moshe Revah

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)


}
3
Isaac Muthui