【问题标题】:New mongoose boolean attribute, everyone at true, default is false新的猫鼬布尔属性,每个人都为真,默认为假
【发布时间】:2016-07-23 23:59:06
【问题描述】:

我有一个用户模型,用于生产。我想添加一个布尔属性(isRegistered)。对于已经在我的平台上的人,我希望这个新属性是真实的。对于新用户,我希望它默认为 false。

我怎样才能将default: false 放到我的猫鼬模型中,但对于已经在这里的人来说是正确的?

谢谢!

【问题讨论】:

  • 首先通过添加新属性在 mongodb 中更新您的集合,然后使用新模型更新您的应用程序;)

标签: node.js mongodb mongoose database-schema


【解决方案1】:

您无需等到部署新应用程序。然后,您已部署并将 isRegistered 字段设置为 true 之后,您可以运行该命令来更新所有未设置该字段的文档。

db.collection.update({
    isRegistered: { $exists: false }
}, {
    isRegistered: true
}, {
    multi: true
})

【讨论】:

  • 谢谢! $exists 在这里起到了作用。它将检查该值是否仅来自默认值或已设置。我添加了一个我在寻找解决方案时发现的东西:如果你设置一个默认值,所有创建的文档都会在 MongoDb 中具有这个值,而不仅仅是通过 Mongoose
【解决方案2】:

我建议:

  • 1) 将 default: false 添加到 Mongoose 模型中的 isRegistred 属性
  • 2) 运行查询以将在特定日期和时间(例如,将更新的模型部署到生产中的那一刻)之前在您的平台上注册的每个人更新为 isRegisteredtrue

这样,您所有的旧用户都将被标记为已注册,而未​​来的用户则不会。我假设您或 MongoDB 正在跟踪一个人的注册日期。

【讨论】:

    【解决方案3】:

    你的架构应该是这样的:

    var UserSchema = new Schema({
        name: String,
        isRegistered: { type: boolean, default: false }
    });
    

    因此,默认情况下,所有用户的isRegistered 字段将是false

    并且已经插入到您的User 集合中的文档将没有isRegistered 字段。因此,您可以更新集合中的所有文档以包含该字段。

    因此,您可以执行以下操作,将isRegistered 字段添加到您的User 集合中的所有文档中。像这样的:

    var conditions = {},
        update = { isRegistered: true },
        options = { multi: true };
    
    UserSchema.update(conditions, update, options, callback);
    function callback (err, numAffected) {
        // numAffected is the number of updated documents
    });
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      相关资源
      最近更新 更多