簡體   English   中英

如何使Mongoose不在文檔中插入空數組或對象字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM