Go中的MongoDB与mgo,带有bson.M / bson.D的运算符始终出现语法错误

这是一种愚蠢的语法错误,尝试了大量方法,但无法正常工作,请有人帮忙 。</ p>

在Go中使用 mgo </ code>的MongoDB,我只是尝试简化使用 $ ne </ code>运算符,如下所示的代码,但一直在获取 编译语法错误:</ p>

 第15行:convIter:= Session.Copy()。DB(“”)。C(“ convs”)。Find(bson.M {\  nline 16:“ conversationStatus”:interface {} {
line 17:bson.M {
line 18:“ $ ne”:“ DESTROYED”
line 19:},
line 20:},
line 21:})。 Iter()
</ code> </ pre>

试图添加逗号 </ code>,到处都删除逗号,只是无法正常工作,总是出现这样的编译语法错误 如下所示:</ p>

  mongodb / query.go:16:语法错误:意外的{,需要逗号或} 
mongodb / query.go:20:语法错误:意外的}, 期望表达式
mongodb / query.go:21:语法错误:意外},期望表达式
</ code> </ pre>
</ div>

展开原文

原文

It is kind of stupid syntax error, tried tons of ways, just couldn't get it work, someone please help.

MongoDB in Go with mgo, I just tried to simplify use the $ne operator, code like below, but kept getting compile syntax error:

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()

Tried to add comma , remove comma everywhere, just couldn't get it work, always got such compile syntax error like below:

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

dsi37923
dsi37923 您是否尝试在第18行的末尾添加?
3 年多之前 回复

1个回答



bson.M </ code> 是地图类型,因此 bson.M {...} </ code>是地图文字。 如果键值对写在多行中,则每个键值对都必须以逗号结尾。 有关详细信息,请参见如何断开 在Golang中排长行代码? </ p>

也没有“ interface”文字,将其删除。 interface {} </ code>类型的值可以保存/包装任何值,包括 bson.M </ code>值。 并且 interface {} </ code>值的创建是自动的,您甚至不需要类型 conversion 。</ p>

正确的语法:</ p>

  convIter:= Session.Copy()。DB(“”)。  C(“ convs”)。Find(bson.M {
“ conversationStatus”:bson.M {
“ $ ne”:“ DESTROYED”,
},
})。Iter()
</ 代码> </ pre>

类似地,如果您使用 bson.D </ code> 类型(这是一个切片),不以文字的右括号结尾的行必须以逗号结尾,例如:</ p>

  d:= bson.D {
{名称:“ fieldA”,值:1},
{名称:“ fieldB”,值:“ running”},
}
</ 代码> </ pre>
</ div>

展开原文

原文

bson.M is a map type, so the bson.M{ ... } is a map literal. If key-value pairs are written in multiple rows, each has to end with a comma. For details, see How to break a long line of code in Golang?

Also there is no "interface" literal, drop that. A value of interface{} type can hold / wrap any value, including a bson.M value. And the interface{} value creation is automatic, you don't even need a type conversion.

Correct syntax:

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

Similarly, if you use the bson.D type (which is a slice), lines not ending with the closing bracket of the literal has to end with a comma, e.g.:

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

doukangbin9698
doukangbin9698 当您需要创建类型为[] interface {}的切片时,则需要在文字中声明切片类型,例如 []界面{} {1,“两个”}。 但是,在您的情况下,您不是在创建切片,而是仅创建一个值,如答案中所述,interface {}值的创建是自动的。
3 年多之前 回复
douxiong5972
douxiong5972 我在这里看到了另一个答案:stackoverflow.com/questions/26932298/…,当文件需要与slice一起使用时,答案显示了正确的方式是:“ $ or”:[] interface {} {bson.M { “ key2”:2},bson.M {“ key3”:2},},如果不使用接口文字,那么正确的方法是什么?
3 年多之前 回复
dongyuqi3808
dongyuqi3808 非常感谢您的快速回答,是的,它可以正常工作。
3 年多之前 回复
立即提问