我正在尝试使用随机数更新集合中的所有文档。每个集合应该有不同的编号。 我目前的代码:
db.myDoc.update({ rand: {$exists : false }},{$set : {rand:Math.random()}},{multi:true})
使用SAME随机值填充所有文档。怎么解决?
答案 0 :(得分:26)
您可以在mongo shell中使用cursor.forEach()
游标方法来实现此目的:
db.myDoc.find({rand: {$exists : false }}).forEach(function(mydoc) {
db.myDoc.update({_id: mydoc._id}, {$set: {rand: Math.random()}})
})
答案 1 :(得分:3)
从Mongo 4.4
开始,$function
聚合运算符允许应用自定义javascript函数来实现MongoDB查询语言不支持的行为。
例如,为了更新具有随机值的文档:
// { "x" : 1 }
// { "x" : 2 }
db.collection.updateMany(
{ rand: { $exists: false } },
[{ $set:
{ rand:
{ $function: {
body: function() { return Math.random(); },
args: [],
lang: "js"
}}
}
}]
)
// { "x" : 1, "rand" : 0.7012578283384967 }
// { "x" : 2, "rand" : 0.21041874709692365 }
$function
具有3个参数:
body
,这是要应用的功能。args
,其中包含记录中函数可以用作参数的字段。在我们的例子中,我们不需要对文档本身进行任何引用即可计算随机值,因此无需计算空数组。lang
,这是编写body
函数的语言。当前仅js
可用。请注意,由于所有操作都是在服务器端一次完成的,因此这现在比find / foreach选项更有效。
答案 2 :(得分:1)
从 Mongo 4.4.2
开始,$rand
聚合运算符每次调用时都会提供 0 到 1 之间的随机浮点数:
// { "x" : 1 }
// { "x" : 2 }
db.collection.updateMany(
{ rand: { $exists: false } },
[{ $set: { rand: { $rand: {} } } }]
)
// { "x" : 1, "rand" : 0.22252333583221115 }
// { "x" : 2, "rand" : 0.9811303782541574 }