我有一个看起来像这样的元素:
{"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项。然而,如果我设置为零,我会得到东西。
答案 0 :(得分:0)
确保仔细检查文档字段名称的大小写。例如,如果您的文档中有
{ "Groups": ["test1", "test2"] }
您还需要使用大写G
进行查询,如下所示:
query := bson.M{"Groups": groupName}
我认为这里的问题是您的文档中包含小写groups
。
您的mgo
Struct却是大写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"`
}