2017-08-04 67 views
2

字符串数组我有,看起来像这样的元件:查询在以MgO

{"Name":"test name","DBType":0,"UserName":"test user","Password":"","Host":"test host","Port":"123","DBName":"test schema","Options":"test options","Groups":["test1"]} 

我希望能够查询数据源的cataloug对于那些被分配到特定组。

我对这个代码是:

var d []Source 
q := bson.M{"Groups": bson.M{"$in": [1]string{groupName}}} 
findErr := c.Find(q).All(&d) 

然而 - 我没有得到任何错误,并没有结果。

我也试过

q := bson.M{"Groups": groupName} 

具有相同的结果。

//Source describes a data source 
type Source struct { 
    Name string 
    DBType  uint 
    UserName string 
    Password string 
    Host  string 
    Port  string 
    DBName  string 
    Options  string 
    Groups  []string 
} 

我被卡住了 - 我很困惑!任何帮助赞赏。

更新 - 我试着

{"Name":"test name"} 

和它返回0项。但是,如果我设定为零,我会得到东西。

+1

那么你实际上并不需要'$ in',这是一个常见的误解,你所做的只是“数组”是“参数”而不是“目标”,而MongoDB并不关心实际数据是否在数组中。检查你实际上是否拥有正确的集合,并且你的'groupName'中的内容实际上就是你的想法。没有返回任何东西的唯一原因是要么你看错了地方,要么寻找错误的东西。查询语法本身很好。 –

+0

我将查询设置为零,并且我获取了源,因此集合是正确的。 – Dan

+0

那么,仍然留下输入,或你的解释。那么当你试图匹配''Name''或''UserName''或基本上任何不是数组的字段时会发生什么?你可能将'groupName'定义为'[] string'而不是'string'。这些都是你的实际问题。 MongoDB或驱动程序没有问题。 –

回答

0

请务必仔细检查文档字段名称的大小写。例如,如果在您的文档,你有

{ "Groups": ["test1", "test2"] } 

您还需要使用如下的资本G查询:

query := bson.M{"Groups": groupName} 

我觉得这里的问题是,你有你的文档中的小写groups

mgoStruct不过是资本Groups,其中mgo将自动映射为小写groups文档字段。因此,使用小写字段groups查询字段名称将不会返回任何匹配(但查询全部)。如果是这样的话,则需要使用查询:

query := bson.M{"groups": groupName} 

但是,如果你的文档字段名是首字母大写,那么你还需要到如下指定marshalling mapping

type Source struct { 
    Name  string `bson:"Name"` 
    DBType uint  `bson:"DBType"` 
    UserName string `bson:"UserName"` 
    Password string `bson:"Password"` 
    Host  string `bson:"Host"` 
    Port  string `bson:"Port"` 
    DBName string `bson:"DBName"` 
    Options string `bson:"Options"` 
    Groups []string `bson:"Groups"` 
}