检查Obejct是否为空:Mongoose嵌套/嵌入文档

时间:2016-07-25 10:14:46

标签: node.js mongodb mongoose

在我的文档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

2 个答案:

答案 0 :(得分:1)

虽然我现在对嵌入式对象_idsdrugSchema = 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/