随机化Go中MongoDB查询的顺序

随机化Go中MongoDB查询的顺序,mongodb,go,random,slice,mgo,Mongodb,Go,Random,Slice,Mgo,我的问题是: 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 { } 我想随机浏览查询项的顺序,以便对请求的每个项进行操作 因此,每次运行

我的问题是:

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)
}
输出(在上尝试):

工作原理:

要洗牌一个片段,函数
shuffle()
会从片段中为每个索引随机选择一个元素。它像向下迭代所有元素一样,从剩余的片段中选择一个随机元素(包括我们当前选择的元素的索引,因为随机顺序也包括元素“保持原位”的元素),并使用随机索引将元素与所选的随机元素交换。循环一直持续到
i>0
(并且直到
i>=0
),因为如果只剩下1个元素,则无需将其与自身交换

使用
rand.Perm()
shuffle()
的另一个变体可以利用它返回一个包含混洗数字的片段。我们可以使用这些随机数来说明如何对结果进行重新排序:

func shuffle(r []BadVideo) {
    r2 := append([]BadVideo(nil), r...)
    for i, j := range rand.Perm(len(r)) {
        r[i] = r2[j]
    }
}
在计算机上尝试此变体


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

您希望mongo将数据随机化,还是希望Golang中发生这种情况?mongo$示例选择器可能就是您要寻找的。我更喜欢在戈朗,但样品可以为我好,但我会喜欢一个与mgo的例子谢谢
func shuffle(r []BadVideo) {
    r2 := append([]BadVideo(nil), r...)
    for i, j := range rand.Perm(len(r)) {
        r[i] = r2[j]
    }
}