sql >> データベース >  >> NoSQL >> MongoDB

Find()の結果としてスライスを取得する方法はありますか?

    MongoDB find()の結果 常にドキュメントのリストです。したがって、値のリストが必要な場合は、手動で変換する必要があります。

    カスタムタイプ(stringから派生)を使用する )

    また、独自の型(stringから派生)を作成する場合にも注意してください。 )、マーシャリング解除ロジックをオーバーライドして、usernameだけを「抽出」することができます。 ドキュメントから。

    これはどのように見えるかです:

    type Username string
    
    func (u *Username) SetBSON(raw bson.Raw) (err error) {
        doc := bson.M{}
        if err = raw.Unmarshal(&doc); err != nil {
            return
        }
        *u = Username(doc["username"].(string))
        return
    }
    

    次に、ユーザー名をスライスにクエリします:

    c := mongodb.DB("mybase").C("mycollection") // Obtain collection
    
    var uns []Username
    err = c.Find(nil).Select(bson.M{"username": 1, "_id": 0}).All(&uns)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(uns)
    

    []Usernameに注意してください []stringと同じではありません 、したがって、これはあなたにとって十分かもしれないし、そうでないかもしれません。 stringの値としてユーザー名が必要な場合 Usernameの代わりに 結果を処理するときに、Usernameを変換するだけです。 stringへ 。

    Query.Iter()の使用

    スライスのコピーを回避する別の方法は、Query.Iter() 、結果を繰り返し処理し、usernameを抽出して保存します 手動で、上記のカスタムアンマーシャリングロジックと同様に。

    これはどのように見えるかです:

    var uns []string
    it := c.Find(nil).Select(bson.M{"username": 1, "_id": 0}).Iter()
    defer it.Close()
    for doc := (bson.M{}); it.Next(&doc); {
        uns = append(uns, doc["username"].(string))
    }
    if err := it.Err(); err != nil {
        fmt.Println(err)
    }
    fmt.Println(uns)
    



    1. MongoDBの日付:DateオブジェクトをMongoデータベースに挿入すると、日付はそれ自体より1日早くなります

    2. 値がnullでないマングースクエリ

    3. hSetキーでTTLを再設定します

    4. MongoDB-オブジェクト内の複数の属性に対してクエリを実行し、結果をグループ化する方法