[英]How to make Mongoose not insert empty array or object fields into a document
假設我們在Node.js
項目中有一個Mongoose
模式:
let coolSchema = new mongoose.Schema({
field_1 : Number,
field_2 : String,
field_3 : [ String ],
});
讓我們有一個相應的對象:
var data = {
field_1 : 123,
field_2 : 'blah',
field_3 : ['aa', 'bb'],
};
現在要將這些數據保存到MongoDB
我們可以使用以下代碼:
let Model = require('mongoose').model('CoolModel', coolSchema);
(new Model(data)).save();
好吧,雖然一切都很酷。
但是,如果data
不包含field_3
(數組字段,並且對象字段也是如此), Mongoose
無論如何都會將此字段添加到正在創建的文檔中,且其值為空。
如果data
對象中不包含該字段,我們可以以某種方式告訴Mongoose
不要創建該字段嗎?
不是特別回答問題本身,而是對此事有一些思考。
目前尚不清楚您要在這里實現什么。 您定義了一個應該包含字符串列表的架構。 貓鼬會正確執行操作,以使模式中保存的數據與模式的定義保持一致。
在這種情況下,列表更多是架構的結構部分。 如果您有不同的行為,則必須在代碼中處理特殊情況,以防列表不存在。 現在,您可以放心地假設架構總是返回列表,因此獲取某些數據將始終允許您執行以下操作:
coolData.field_3.forEach(function(x) {
do_cool_things(x)
})
您要問的是使架構允許從mongodb返回不一致的數據...換句話說,您必須這樣做以防止訪問未定義的屬性:
if (coolData.field_3) {
coolData.field_3.forEach(function(x) {
do_cool_things(x)
})
}
另外,我正在嘗試優化對象/數據庫的大小,可以填充錯誤報告,以便mongoose在保存對象時不會定義空值,並且在mongodb中缺少字段時會使用默認值自動填充它們。 (我可能是錯的,但是您是否真的檢查過mongodb中的數據是否包含空值,或者您只是在查看來自貓鼬的數據?)
您可以輕松地跳過數組字段和對象字段數組。這將使您跳過在新文檔中保存空數組的操作。但是您必須為此使用pre hook。
var brandSchema = new Schema({
name : {type:String},
email:String,
check:[]
})
brandSchema.pre('save', function (next) {
if (this.isNew && 0 === this.check.length) {
this.check = undefined;
}
next();
})
當您在架構中插入新文檔時,您必須使用此middlware。 這是我們要插入任何文檔時的響應
"data": {
"__v": 0,
"name": "testing",
"email": "testing@gmail.com",
"_id": "5915b018e292833edda8837f"
}
所以我只發送電子郵件和名稱,但跳過check(array)字段(不發送任何值)。
這是因為您沒有在架構定義中標記所需的字段。 做這個:
let coolSchema = new mongoose.Schema({
field_1 : { type: Number, required: true },
field_2 : { type: String, required: true },
field_3 : { type: [ String ], required: true },
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.