2016-11-21 44 views
0

我想在Mongoose模式中設置可選字段。我的Log模式。如何使可選的字段基於Mongoose中的其他字段?

var logSchema = new Schema({ 
    logType: { 
     type: String, 
     enum: ['user', 'lead', 'knowledgecenter'], 
     required: true 
    }, 
    userLog: { 
     name: { 
      type: String, 
      required: true 
     }, 
     userId: { 
      type: Schema.Types.ObjectId, 
      required: true 
     } 
    }, 
    leadLog: { 
     title: { 
      type: String, 
      required: true 
     }, 
     leadId: { 
      type: Schema.Types.ObjectId, 
      required: true 
     } 
    } 
}); 

我想插入上面Log架構文檔或者與{logType:'user',userLog:{userId:'5fcJFjslkka4lsdk'}}{logType:'lead',leadLog:{leadId:'5fcJFjslkka4lsdk'}}

但此時貓鼬ValidatorError: Path required錯誤。

+0

在貓鼬的所有字段默認可選除了'id'場! – 0xtvarun

+0

但在這裏我爲每個字段設置了'required'選項。所以,他們現在不是可選的。 – vineet

回答

1

而不是將required設置爲true您可以將其設置爲只在需要時才返回true的函數。

這應該做的伎倆:

var logSchema = new Schema({ 
    logType: { 
     type: String, 
     enum: ['user', 'lead', 'knowledgecenter'], 
     required: true 
    }, 
    userLog: { 
     name: { 
      type: String, 
      required: function() { return this.logType === 'user'; } 
     }, 
     userId: { 
      type: Schema.Types.ObjectId, 
      required: function() { return this.logType === 'user'; } 
     } 
    }, 
    leadLog: { 
     title: { 
     type: String, 
     required: function() { return this.logType === 'lead'; } 
     }, 
     leadId: { 
     type: Schema.Types.ObjectId, 
     required: function() { return this.logType === 'lead'; } 
     } 
    } 
}); 
+0

謝謝@Josh,你能否給我建議任何其他設計的上述模式哪個更好。 – vineet

+1

@vineetsah,我暫時不用貓鼬,我只是想起了解決這個特定的頭痛問題。也就是說,你的模式對我來說看起來不錯。 – Josh

相關問題