使用随机数更新集合中的所有文档

时间:2014-11-21 15:52:40

标签: mongodb random

我正在尝试使用随机数更新集合中的所有文档。每个集合应该有不同的编号。 我目前的代码:

db.myDoc.update({ rand: {$exists : false }},{$set : {rand:Math.random()}},{multi:true})

使用SAME随机值填充所有文档。怎么解决?

3 个答案:

答案 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  }