我已经尝试过执行Math.random()和__rand(),但是输出中的所有记录仍然具有相同的值,是否有解决方法?
db.collection.aggregate(
[
{
$group:{
_id: '$orderNumber',
data: {
$push: '$orderNumber'
}
}
},
{
$addFields: {
random: _rand()
}
},
{$out: 'delete'}
]
)
输出示例
{
_id:"MK5K44FJ5N"
pivotData: {
random: 0.34
}
},
{
_id:"HKSH755K"
pivotData: {
random: 0.34
}
}
如您所见,相同的随机值有数百个。这些随机数的目的是让我以后可以对该字段建立索引并分发此类文档的处理。
示例:我稍后必须对文档进行一些Java处理,因此我计划添加该随机数并对其进行索引,然后将文档的处理分布到多个线程中,其中每个线程都查询这样一个范围随机数,因为随机数刚好在1到100之间,所以每个线程有10个线程可以得到它自己的10个数字范围,每个线程有几百万个文档。
答案 0 :(得分:2)
函数_rand()
仅存在于客户端,而不存在于服务器。这意味着在将查询发送到服务器之前先对其进行评估并替换为管道数组,因此实际发送并运行的管道如下所示:
db.iReconTxCollection.aggregate(
[
{
$group:{
_id: '$orderNumber',
data: {
$push: '$orderNumber'
}
}
},
{
$addFields: {
random: 0.34
}
},
{$out: 'delete'}
]
)
除了在客户端生成随机数并为每个文档提交单独的更新外,我不知道实现此目标的方法。
修改
对确定性生成器的考虑:
{$addFields: {
randomish:{
$reduce:{
input:{
$regexFindAll:{
input:{$toString:"$_id"},
regex:"."
}},
initialValue:1,
in:{
$mod:[
{$multiply:[
{$indexOfBytes:["0123456789abcdef","$$this.match"]},
"$$value"
]},
101
]
}
}
}
}}
答案 1 :(得分:0)
乔的答案是正确的,因为我的分片键上附加了4个随机数字,而我只需要1到100之间的随机数,所以我最终没有这样做。尽管有服务器端_rand()函数也很好
function sum {
#let result=$1+$2 Can be omitted
echo "$1 + $2 equals $(($1+$2))"
}