MongoDB в Go с mgo, операторы с bson.M/bson.D всегда получали синтаксическую ошибку

Это своего рода глупая синтаксическая ошибка, перепробовал массу способов, просто не смог заставить ее работать, кто-нибудь, пожалуйста, помогите.

MongoDB в Go с 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

person lnshi    schedule 02.03.2017    source источник
comment
Вы пытались добавить , в конец строки 18?   -  person Gujarat Santana    schedule 02.03.2017


Ответы (1)


bson.M — это тип карты, поэтому bson.M{ ... } — это литерал карты. Если пары ключ-значение записаны в несколько строк, каждая из них должна заканчиваться запятой. Подробнее см. в разделе Как сломать длинная строка кода на Голанге?

Также нет литерала «интерфейса», отбросьте это. Значение типа interface{} может содержать/оборачивать любое значение, включая значение bson.M. И создание значения interface{} происходит автоматически, вам даже не нужна конверсия.

Правильный синтаксис:

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"},
}
person icza    schedule 02.03.2017
comment
Большое спасибо за ваш супер быстрый ответ, да, это работает. - person lnshi; 02.03.2017
comment
я видел здесь еще один ответ: заголовок stackoverflow.com/questions/26932298/ , когда поле нужно использовать с фрагментом, тогда ответ показал правильный путь: "$or": []interface{} {bson.M{"key2": 2}, bson.M{"key3": 2},}, , если не использовать литерал interface, как правильно это сделать? - person lnshi; 02.03.2017
comment
@lnshi Когда вам нужно создать срез типа []interface{}, вам нужно указать тип среза в литерале, например []interface{}{1, "two"}. Но в вашем случае вы создаете не срез, а только одно значение, из которых создание значения interface{} происходит автоматически, как указано в ответе. - person icza; 02.03.2017