【问题标题】:Check if Obejct is Empty: Mongoose Nested/Embedded Document检查对象是否为空:猫鼬嵌套/嵌入文档
【发布时间】:2016-11-28 15:15:07
【问题描述】:

在我的文档预保存挂钩中,我检查嵌套属性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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    默认情况下,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/

    【讨论】:

    • 实际上它并没有像你提到的那样保存对象,但我很好。也许我没有足够具体地询问我试图完成什么:如果嵌套属性之一为空但并非所有属性都为空,我想在我的预保存挂钩中返回一个错误。目前我检查对象是否存在:如果data.accident? && (data.accident['kind']? || data.accident['date']? || data.accident['company']?)在我看来不是很漂亮的代码。然后我检查是否所有属性都存在以及它们是否具有正确的值。
    • 我想将上述检查重构为console.log 示例中的一些表达式。另外我想了解为什么该对象不是预保存挂钩中的空对象/行为类似。
    • 嗨,我不想使用Mixed,因为我知道子对象的结构。我尝试了markModified ,它对我不起作用。但这将我引向另一个帖子和一个我可以接受的解决方案:stackoverflow.com/questions/8002145/… 我什至不需要打电话给markModified function 但我有_ids 我现在不需要。跨度>
    【解决方案2】:

    尽管我现在在不需要的嵌入对象上有 _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,
      ...
    

    在此之后,对象在预保存挂钩中未定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 2018-02-24
      • 2015-09-06
      • 1970-01-01
      • 2016-06-08
      相关资源
      最近更新 更多