Mongoose 单个嵌入子文档默认
Posted
技术标签:
【中文标题】Mongoose 单个嵌入子文档默认【英文标题】:Mongoose single embedded sub-document default 【发布时间】:2016-05-31 09:51:10 【问题描述】:Mongoose 在 4.2.7 版中创建了一个新的单个子文档功能(documentation 和 feature 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
);
【问题讨论】:
【参考方案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.Schema
和UserSchema
简单地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: () => ([]),
)
【讨论】:
以上是关于Mongoose 单个嵌入子文档默认的主要内容,如果未能解决你的问题,请参考以下文章