【问题标题】:set a random values in a field using UpdateMany in mongoose query在 mongoose 查询中使用 UpdateMany 在字段中设置随机值
【发布时间】:2021-08-23 07:08:45
【问题描述】:

我想知道在 mongoose 中使用 UpdateMany 更新许多文档时是否可能需要设置 ["pending", "settled"] 到一个名为 payment_settlement 的键,用于不同的文档。

为了更好地理解,我在这里添加路线:

router.post("/payment_settlement", (req, res, next) => {
    var ar = ["pending", "settled"];
    models.Payment.updateMany({ $set: { payment_settlement: ar[Math.floor(Math.random() * 2)] } })
        .then(_ => {
            return funcs.sendSuccess(res, _);
        })
        .catch(next);
});

对于“待处理”或“已解决”的所有文档,上述方法给了我相同的结果。 我的疑问是 MongoDB(Mongoose) 在开始时计算一次随机值,并对所有文档使用该单个随机值。

但是,我们可以在 mongoose 模式中使用 enum 来实现这一点。但我需要用随机值更新现有文档。

非常感谢任何想法或讨论。

谢谢

【问题讨论】:

  • 你用的是哪个版本的mongodb?
  • MongoDB的版本是4.4.2

标签: node.js mongodb express mongoose


【解决方案1】:

因为您使用的是 mongodb 版本 4.4.2,所以您可以使用 Updates with Aggregation Pipeline$rand 运算符:

models.Payment.updateMany(
  {},
  [
    {
      $set: {
        payment_settlement: {
          $arrayElemAt: [
            ["pending", "settled"],
            { $round: { $rand: {} } }
          ]
        }
      }
    }
  ]
)

MongoPlayground

或者,如果您的数组有超过 2 个元素,您可以使用 $multiply$rand

models.Payment.updateMany(
  {},
  [
    {
      $set: {
        payment_settlement: {
          $arrayElemAt: [
            ["pending", "settled", "cancelled"],
            { $round: { $multiply: [{ $rand: {} }, 2] } }
          ]
        }
      }
    }
  ]
)

MongoPlayground

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 2020-04-04
    • 1970-01-01
    • 2017-07-21
    • 2015-09-24
    • 2014-12-30
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多