在mgo中查询字符串数组

I have an element that looks like this:

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

I want to be able to query the cataloug of Datasources for those which are assigned to a particular group.

My code for this is:

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

However - I get no error and no results.

I've also tried

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

with the same result.

//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
}

I'm stuck - I am puzzled! Any help appreciated.

Update - I tried

{"Name":"test name"}

and this returns 0 items. Yet if I set to nil I get stuff.

dshdb64088
dshdb64088 q:=bson.M{“Groups”:groupName}是适合您的情况的正确查询。您是否在mongoshell中尝试过查询?
接近 3 年之前 回复
douguai6716
douguai6716 好了,仍然剩下输入或您的解释。那么,当您尝试匹配“名称”或“用户名”或基本上不是数组的任何其他字段时,会发生什么?您是否可以将groupName定义为[]string而不是string。这些都是您的实际问题。MongoDB或驱动程序没有错。
接近 3 年之前 回复
dongxiong2000
dongxiong2000 我将查询设置为nil,并获得了Sources,因此该集合是正确的。
接近 3 年之前 回复
duanque19820925
duanque19820925 好吧,您实际上并不需要$in,这是一个常见的误解,您确实需要$in,但是“数组”是“参数”而不是“目标”,并且MongoDB不在乎实际数据是否在数组中。检查您是否实际上具有正确的集合,并且groupName中的内容确实是您认为的那样。不返回任何东西的唯一原因是您在错误的位置寻找东西或在寻找错误的东西。查询语法本身很好。
接近 3 年之前 回复

1个回答



请确保再次检查文档字段名称的大小写。 例如,如果您的文档中有</ p>

  {“ Groups”:[“ test1”,“ test2”]} 
</ code> </ pre>

您还需要使用大写的 G </ code>进行查询,如下所示:</ p>

  query:= bson.M {“ Groups”:groupName}

</ code> </ pre>

我认为这里的问题是您的文档中有小写的 groups </ code>。 </ p>

您的 mgo </ code> 结构不过是大写字母 Groups </ code>, mgo </ code>将自动映射到小写的 groups </ code>文档字段。 因此,使用小写的 groups </ code>字段名称进行查询将不会返回任何匹配项(但查询所有匹配项)。 在这种情况下,您需要使用以下查询:</ p>

  query:= bson.M {“ groups”:groupName} 
</ code> </ pre> \ n

但是,如果您的文档字段名称使用大写字母大写,则还需要指定编组映射,如下所示:</ p>

  type源结构{
名称字符串bson:“名称”
DBType uintbson:“ DBType”
用户名字符串bson:“ UserName”
密码字符串bson:“ Password”
主机字符串bson:“ Host”
端口字符串bson:“ Port”

DBName字符串bson:“ DBName”
选项字符串bson:“ Options”
组[]字符串bson:“ Groups”
}
</ code> </ pre>
</ DIV>

展开原文

原文

Make sure to double check the capitalisation of your document field names. For example, if in your documents you have

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

You also need to query using capital G as below:

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

I think the issue here is that you have lower case groups in your document.

Your mgo Struct however is capital Groups, which mgo will automatically map to lower case groups document field. Thus querying using lower case groups field name will not return any match (but query all does). If this is the case, you need to query using:

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

If however, your document field names are in first letter capital, then you also need to specify marshalling mapping as below:

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"`
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐