登录
首页 >  Golang >  Go问答

在 Go 中随机化 MongoDB 查询的顺序

来源:Golang技术栈

时间:2023-05-04 08:02:47 443浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《在 Go 中随机化 MongoDB 查询的顺序》,这篇文章主要会讲到golang等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

这是我的查询:

c := session.DB("searchV").C("video")
var results []BadVideo
err5 := c.Find(nil).All(&results)
fmt.Println("request done")
if err5 != nil {
    panic(err5)
}
var i = 0
for _,badvideo := range results {
}

我想随机化浏览查询项目的顺序,以便对请求的每个项目进行操作......

所以每次我运行它时,我都会以不同的顺序浏览它。

正确答案

手动洗牌

这是一个简单的洗牌算法,它洗牌(随机化)一个[]BadVido切片:

func shuffle(r []BadVideo) {
    for i := len(r) - 1; i > 0; i-- {
        j := rand.Intn(i + 1)
        r[i], r[j] = r[j], r[i]
    }
}

因此,在您加载结果后,只需调用shuffle(results)它即可。

为了测试,我将使用一个简单的BadVideo类型:

type BadVideo struct {
    Name string
}

func main() {
    rand.Seed(time.Now().UnixNano())
    results := []BadVideo{{"a"}, {"b"}, {"c"}, {"d"}, {"e"}}
    shuffle(results)
    fmt.Println(results)
}

输出(在Go Playground上试试):

[{c} {d} {b} {e} {a}]

这个怎么运作:

为了打乱一个切片,该shuffle()函数从切片中为每个索引随机选择一个元素。它喜欢向下遍历所有元素,并从剩余切片中选择一个随机元素(包括我们当前选择的元素的索引,因为随机顺序还包括元素“保持原位”的元素),并使用随机索引将元素与选择的随机元素交换。循环直到`i

0(而不是直到i >=0`),因为如果只剩下 1 个元素,则无需将其与自身交换。

使用rand.Perm()

的另一个变体shuffle()可以利用rand.Perm()它返回一个包含随机数字的切片。我们可以使用这些随机数来告诉如何重新排序结果:

func shuffle(r []BadVideo) {
    r2 := append([]BadVideo(nil), r...)
    for i, j := range rand.Perm(len(r)) {
        r[i] = r2[j]
    }
}

在Go Playground上试试这个变体。

这里需要注意一点:在我们进行重新排序之前,我们必须保存原始切片(复制它),这样我们可以在将结果写入切片时选择由随机索引指定的原始元素。我通过将完整切片附加到切片来创建副本nil

终于介绍完啦!小伙伴们,这篇关于《在 Go 中随机化 MongoDB 查询的顺序》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>