2014-11-02 29 views
3

通知下面的代碼,即示出了具有2個陣列架構中,一個被配置爲從類型:貓鼬在陣列中除去空對象出嵌入文檔的

[ 
    mongoose.Schema.Types.Mixed 
] 

和一個被構造成可從型:

[ 
{ 
    value: mongoose.Schema.Types.Mixed 
} 
] 

下面是代碼:

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 
var schema = new mongoose.Schema({ 
    withSchema: [{ 
    value:mongoose.Schema.Types.Mixed} 
    ], 
    withoutSchema: [mongoose.Schema.Types.Mixed], 
} , {minimize: false}); 
var Tweak = mongoose.model('tweak', schema); 

我使用相同的數據更新該文檔:

var data = { 
    "withSchema" : [ { "value": { a:"221", b:{} } } ], 
    "withoutSchema" : [ { "value": { a:"221", b:{} } } ] 
} 
Tweak.findByIdAndUpdate("545680170960023a185ea77e", data, function(err, doc){ 
    console.log(doc); 
    //{ 
    // "withSchema" : [ { "value": { a:"221" } } ], 
    // "withoutSchema" : [ { "value": { a:"221", b:{} } } ] 
    //} 
}); 

如何防止此b:{}移除?

編輯

事實證明,這種情況發生時,纔會有一個embeddedDocument內部數組。

+0

您正在使用的貓鼬版本是什麼? – BatScream 2014-11-11 05:57:51

+0

[email protected] – ekeren 2014-11-11 07:52:34

回答

-3

評估爲null(與您的b一樣)的對象被貓鼬略過。作爲一個空的或不存在的對象,在所有的MongoDB驅動程序中甚至是shell查詢中都會計算到null,實際上它並沒有太大的區別,空的b被保存與否。

例如,如果您查詢,如果b存在,因爲b是空的,它的計算結果null,因此查詢將失敗的那個文件,無論是否b的值爲空或者根本不存在。

由於您已經使用minimize選項,我假設空結果因爲它的計算結果爲空,所以不顯示。在使用shell進行檢查時,鍵值應該是空的。底線:出於所有實際目的,它沒有任何區別,B有空值或根本就不存在。

+0

他們允許{minimize:false}選項,因爲它在許多情況下有所不同......這是一個可怕的答案(IMO) – ekeren 2014-11-04 22:21:05

+0

重要的是要提到,這是一個問題,如果你保存空{}直接拋出mongodb本地驅動程序它將保留空對象。 – ekeren 2014-11-04 22:25:45

+0

我無法看到在合理創建的查詢中產生實際差異的用例。密鑰的存在不應該具有隱含的意義。當檢查'a.b'爲null時,它確實沒有區別,因爲它不存在,因爲它根本就不存在,因此評估爲null或者它顯式地包含null值。 – 2014-11-04 23:04:01

0

這種方法涉及首先從Mongo檢索文檔,然後發出更新命令(通過調用保存觸發)。看看下面的代碼。

var id = "54619b5ef610b70b14a46e79"; 
 
Tweak.findById(id, function(err, result) { 
 
    if (err) { 
 
     console.log(err); 
 
    } 
 
    console.log(result.withSchema[0].value); 
 
    result.withSchema[0].value = data.withSchema[0].value; 
 
    result.withoutSchema.value = data.withoutSchema.value; 
 
    result.save(function(err) { 
 
     if (err) { 
 
      console.log(err); 
 
     } 
 
     console.log('updated'); 
 
    }); 
 
});

保存文檔時運行的代碼片段與適當的 'id' 值後。