当前位置: 首页 > 面试题库 >

有没有一种方法可以通过Find()获得切片?

陶永望
2023-03-14
问题内容

现在我正在做:

sess := mongodb.DB("mybase").C("mycollection")
var users []struct {
    Username string `bson:"username"`
}

err = sess.Find(nil).Select(bson.M{"username": 1, "_id": 0}).All(&users)
if err != nil {
    fmt.Println(err)
}

var myUsers []string
for _, user := range users{
    myUsers = append(myUsers, user.Username)
}

有没有更有效的方法直接从Find(或其他搜索功能)中获取带有用户名的slice,而没有struct和range循环?


问题答案:

MongoDB的结果find()始终是文档列表。因此,如果要获取值列表,则必须像以前一样手动将其转换。

使用自定义类型(源自string

另外请注意,如果您要创建自己的类型(从派生string),则可以覆盖其取消编组逻辑,并username仅从文档中“提取” 。

它看起来像这样:

type Username string

func (u *Username) SetBSON(raw bson.Raw) (err error) {
    doc := bson.M{}
    if err = raw.Unmarshal(&doc); err != nil {
        return
    }
    *u = Username(doc["username"].(string))
    return
}

然后将用户名查询成片:

c := mongodb.DB("mybase").C("mycollection") // Obtain collection

var uns []Username
err = c.Find(nil).Select(bson.M{"username": 1, "_id": 0}).All(&uns)
if err != nil {
    fmt.Println(err)
}
fmt.Println(uns)

请注意,这[]Username与并不相同[]string,因此这可能对您还不够。如果您需要一个用户名作为值的string代替,而不是Username在处理结果时,只需将a转换为Username即可string

使用 Query.Iter()

避免切片复制的另一种方法是调用Query.Iter()迭代结果并username手动提取和存储,类似于上述自定义编组逻辑的工作方式。

它看起来像这样:

var uns []string
it := c.Find(nil).Select(bson.M{"username": 1, "_id": 0}).Iter()
defer it.Close()
for doc := (bson.M{}); it.Next(&doc); {
    uns = append(uns, doc["username"].(string))
}
if err := it.Err(); err != nil {
    fmt.Println(err)
}
fmt.Println(uns)


 类似资料:
  • 我试图让我的UI显示两个按钮,其中一个稍微重叠在另一个,在一个全幅卡的中间。因为堆栈的宽度只能与其未定位的子级相同,所以我添加了一个宽度为double.infinity的SizedBox的未定位子级,以便给我一个画布来放置按钮,但我不知道该放什么作为SizedBox的高度。理想情况下,无论用户是在手机上还是在平板电脑上,我都希望这个小部件能够适当地调整自己的大小,所以我宁愿将SizedBox的高度

  • 假设我有一个简单的JFrame,它有一个包含3个面板的JTabbedPane,第二个面板包含一个JComponent。当“Tab2”面板从其容器中移除时,是否有方法通知JComponent?我的问题是JComponent可能在层次结构的深处。 显然,我在这里寻找的是SWING解决方案...:) 我试图使用setridorRemoved(),但没有成功。我显然做错了什么... ASCII艺术是用Ja

  • 问题内容: 我正在使用GhostDriver的Java绑定对PhantomJS运行Selenium接受测试。 如果PhantomJS请求的网页之一通过console.log登录到Javascript控制台,是否可以捕获或查看这些消息? 我想这的答案很简单,但我无法解决! 问题答案:

  • 问题内容: 通过,我们可以创建/修改连接的参数,但是我想知道是否可以通过API进行相同的操作,以便可以以编程方式设置连接 似乎它只处理实际连接到实例,而不是将其保存到列表中。似乎应该已经实现了一个功能,但是我不确定在哪里可以找到该特定功能的文档。 问题答案: 连接实际上是一个模型,可以用来查询和插入新连接

  • 问题内容: 我正在寻找类似的东西: 我需要使用JS获取元素的innerHTML(要在Selenium WebDriver / Java中使用它,因为WebDriver本身无法找到它),但是如何? 我可以使用ID属性,但并非所有元素都具有ID属性。 [固定] 我正在使用jsoup在Java中完成它。这符合我的需求。 问题答案: 您可以使用: 计算XPath表达式字符串,并在可能的情况下返回指定类型的

  • 所以我试图用cheerio从我的脚本标签HTML中获取数据 下面是我的scripttag.html: 从playerintance.setup中常量标题->标题 从PlayerInstance.setup中常量srcfiles->源->文件 来自PlayerInstance.setup的常量图像->图像