在我的文档pre save hook中,我检查嵌套属性accident
中的所有属性是否存在并且具有正确的值。如果accident
根本不存在,这也没关系。
当我尝试保存对我的文档的嵌套属性accident
没有任何价值的文档时,它仍会进入我的自定义验证规则。这是因为我无法检测此嵌套对象是否为空。
prescriptionSchema = mongoose.Schema({
accident: {
kind: String, #accident, workAccident,
date: Date,
company: String
},
...
console.log _.isEqual(data.accident, {}) #false
console.log JSON.stringify data.accident #{}
console.log JSON.stringify data.accident == JSON.stringify {} #false
console.log JSON.stringify {} #{}
console.log Object.keys(data.accident).length #14
for key, value of data.accident
console.log key, value #gives me basically the whole document with functions etc.
if data.accident? && (data.accident['kind'] || data.accident['date'] || data.accident['company']) #=> do validation
newRecipe = new RecipeModel()
for key, value of recipe
newRecipe[key] = value
newRecipe.save((err, result) ->
return next err if err?
return next "No Id" if !result._id?
return next null, result._id
)
我尝试了{}
,null
,没有将其作为recipe.accident
的值。
猫鼬版本:4.0.2
节点版本:5.9
答案 0 :(得分:1)
虽然我现在对嵌入式对象_ids
有drugSchema = mongoose.Schema({
name: String,
exchangeable: Boolean
})
accidentSchema = mongoose.Schema({
kind: String, #accident, workAccident,
date: Date,
company: String
})
prescriptionSchema = mongoose.Schema({
drugs: [drugSchema],
dutiable: Boolean,
accident: accidentSchema,
...
这个我不需要的解决方案,但此解决方案仍有效。
我从主模式中移出了对象,并将其定义为自己的子模式:
<div ng-show=showMe>
<!--content goes here -->
<ul>
<li ng-hide = "showMe">item1</li>
<li ng-hide = "showMe">item2</li>
<li ng-hide = "showMe">item3</li>
<li ng-hide = "">item4</li>
</ul>
</div>
在此之后,对象在预保存挂钩中未定义。
答案 1 :(得分:0)
默认情况下, mongoose 不会保存空对象。您需要禁用架构中的最小化选项。
prescriptionSchema = mongoose.Schema({
accident: {
kind: String, #accident, workAccident,
date: Date,
company: String
},
...
}, {
minimize: false
})
来源: http://mongoosejs.com/docs/guide.html#minimize
更新:如果未保存对象,则可以尝试使用markModified()
方法(http://mongoosejs.com/docs/schematypes.html#mixed)。
对于您的检查问题,您可以执行一项功能来检查您的字段。以下是两个示例:https://jsfiddle.net/ew2um2dh/13/