web-dev-qa-db-ja.com

GoのMongoDBとmgo、bson.M /bson.Dの演算子は常に構文エラーが発生しました

それは一種の愚かな構文エラーであり、たくさんの方法を試しましたが、うまくいきませんでした。誰か助けてください。

GoのMongoDBとmgo$ne演算子の使用を単純化しようとしましたが、以下のようなコードですが、コンパイル構文エラーが発生し続けました。

line 15: convIter := Session.Copy().DB("").C("convs").Find(bson.M {
line 16:   "conversationStatus": interface{} {
line 17:     bson.M {
line 18:       "$ne": "DESTROYED"
line 19:     },
line 20:   },
line 21: }).Iter()

カンマを追加しようとしました,どこでもカンマを削除しましたが、機能しませんでした。常に次のようなコンパイル構文エラーが発生しました。

mongodb/query.go:16: syntax error: unexpected {, expecting comma or }
mongodb/query.go:20: syntax error: unexpected }, expecting expression
mongodb/query.go:21: syntax error: unexpected }, expecting expression
8
lnshi

bson.M はマップタイプであるため、bson.M{ ... }マップリテラル です。キーと値のペアが複数の行に書き込まれる場合、それぞれがコンマで終わる必要があります。詳細については、 Golangで長いコード行を分割する方法 を参照してください。

また、「インターフェイス」リテラルはありません。削除してください。 interface{}型の値は、bson.M値を含む任意の値を保持/ラップできます。また、interface{}値の作成は自動的に行われるため、型 conversion も必要ありません。

正しい構文:

convIter := Session.Copy().DB("").C("convs").Find(bson.M{
    "conversationStatus": bson.M{
        "$ne": "DESTROYED",
    },
}).Iter()

同様に、 bson.D タイプ(スライス)を使用する場合、リテラルの閉じ括弧で終わらない行は、コンマで終わる必要があります。例:

d := bson.D{
    {Name: "fieldA", Value: 1},
    {Name: "fieldB", Value: "running"},
}
7
icza