【问题标题】:Mongoose single embedded sub-document defaultMongoose 单个嵌入子文档默认
【发布时间】:2016-05-31 09:51:10
【问题描述】:

Mongoose 在 4.2.7 版中创建了一个新的单个子文档功能(documentationfeature request),允许单个嵌入式子文档架构,其行为方式与一对多子文档的行为方式相同。

在父级保存时创建默认单个子文档的最佳方法是什么?

var UserPermisssionsSchema = new mongoose.Schema({
    siteAdmin: {
        type: Boolean,
        default: false,
    }
});

var UserSchema = mongoose.Schema({
  fname: String,
  lname: String,
  permissions: UserPermisssionsSchema 
});

我希望在创建父用户文档时使用默认值创建 permissions 字段。

这不起作用:

var UserSchema = mongoose.Schema({
  fname: String,
  lname: String,
  permissions: {
    type: UserPermisssionsSchema ,
    default: UserPermisssionsSchema
  }
});

【问题讨论】:

    标签: mongoose


    【解决方案1】:

    请试试这个

    var PerSchema = new mongoose.Schema({
        siteAdmin: {type: Boolean, default: false}
      }); 
    
    var UserSchema = mongoose.Schema({
      fname: String,
      lname: String,
      permissions: { type: PerSchema, default: () => ({}) },
    });
    

    Mongoose v4.4.3测试它

    var User = mongoose.model('User', UserSchema);
    
    function setUser() {
        var u = new User({
            fname: 'asa',
            lname: 'dddd'
        });
    
        u.save(function(err) {
            if (err)
                console.log(err);
            else
                console.log('save user successfully');
        });
    }
    

    结果是

    { 
      "_id" : ObjectId("56c68321a548be98198ebb71"), 
      "fname" : "asa", 
      "lname" : "dddd", 
      "permissions" : {
           "_id" : ObjectId("56c68321a548be98198ebb70"), 
           "siteAdmin" : false
           },
       "__v" : 0
    }
    

    如果你想要permissions 的默认值是{}。请尝试如下

    var PerSchema = mongoose.Schema({
        siteAdmin: {type: Boolean}
    }, {_id: false}); 
    
    var UserSchema = mongoose.Schema({
        fname: String,
        lname: String,
        permissions: { type: PerSchema, required: true, default: {} },
    }); 
    

    测试

    function setUser() {
        var u = new User({
            fname: 'asa',
            lname: 'dddd'
        });
    
        u.save(function(err) {
            if (err)
                console.log(err);
            else
                console.log('save user successfully');
        });
    }
    

    结果是

    { "_id" : ObjectId("56c687427191d54021875fb1"), 
      "fname" : "asa", 
      "lname" : "dddd",
      "permissions" : {  }, 
      "__v" : 0
    }
    

    【讨论】:

    • 这也不起作用。错误是:key $__ must not start with '$'
    • @steampowered,我测试它并在我的答案中显示结果,如果我错过了什么,请告诉我......
    • 出现错误时我正在使用4.2.7,但现在当我升级到 4.4.3 时它可以工作了!
    • 您有什么理由将PerSchema 定义为 mongoose.SchemaUserSchema 简单地mongoose.Schema
    • 请不要将default 设置为模式实例。 default: PerSchema 是错误的,并在最近版本的 Mongoose 中引发错误。请改用default: () => ({})
    【解决方案2】:

    这里是 Mongoose 的维护者,我推荐这个:

    var UserSchema = mongoose.Schema({
      fname: String,
      lname: String,
      permissions: 
        type: UserPermisssionsSchema ,
        default: () => ({}),
      }
    });
    

    这将使permissions 默认为空对象,相对于UserPermissionsSchema 可能具有的任何默认值。如果您将default 设置为UserPermisssionsSchema,如果您的某个属性碰巧与猫鼬模式方法重叠,您可能会遇到一些不良行为。

    【讨论】:

    • 如果我们不使用外部定义架构,而是使用 type:Object 并仅定义嵌入在权限字段中的子文档,您如何设置默认值?
    【解决方案3】:

    Mongoose 单个嵌入子文档默认

    var UserPermisssionsSchema = new mongoose.Schema({
        siteAdmin: {
            type: Boolean,
            default: false,
        }
    });
    
    var UserSchema = mongoose.Schema({
      fname: String,
      lname: String,
      permissions: 
        type: UserPermisssionsSchema,
        default: () => ({}),
    })
    

    Mongoose 多个(Array) 嵌入子文档默认

    var UserPermisssionsSchema = new mongoose.Schema({
        siteAdmin: {
            type: Boolean,
            default: false,
        }
    });
    
    var UserSchema = mongoose.Schema({
      fname: String,
      lname: String,
      permissions: 
        type: [UserPermisssionsSchema],
        default: () => ([]),
    })
    

    【讨论】:

      猜你喜欢
      • 2015-09-14
      • 1970-01-01
      • 2018-11-22
      • 2013-12-28
      • 2015-07-17
      • 2012-02-18
      • 2012-08-26
      • 2014-06-12
      • 2023-03-10
      相关资源
      最近更新 更多