2016-06-20 7 views
0

を削除しますか?マングースfindOneAndUpdateは私の急行/マングースのコードでは、ネストされたVARS

マイスキーマ:

var MySchema = new Schema({ 
    active: { type: Boolean, required: true, default: true }, 
    myvar: { 
    useDefault: { type: Boolean, required: true }, 
    custom: { type: String }, 
    default: { type: String } 
    } 
}); 

マイ特急ミドルウェア更新機能:

var updateData = req.body; 
MySchema.findOneAndUpdate({ active: true }, updateData, function(err, myschema) { 
    if (err) throw err; 
    if (!myschema) { response(403, { success:false, message: "myschema not updated." }, res); } 
    // success 
    response(200, { success:true, message: "myschema updated." }, res); 
}); 

レコードは最初に次のようになります。

{ 
    "myvar": { 
     "useDefault": true, 
     "custom": "some custom var", 
     "default": "some value" 
    } 
} 

私はMYVARを言うためにアップデートを送信すると.useDefaultの値は次のようになります。

{ 
    "myvar": { 
     "useDefault": false 
    } 
} 

誰がどのようにのみ対象とVARを更新するために助言し、彼らがいたとして、他のVARSを残すことができますか?

+2

ねえ、なぜあなたが使用していないここでは、コードの関連するビットがありますこのMySchema.findOneAndUpdateような({アクティブ:真}、{$セット:{myvar.userdefault:req.body.myvar.userdefault}}、機能(ERR、MYSCHEMA){ –

+0

私は更新されている内容プロパティを知らないので、それを3つのフィールド、2つまたは1つだけのフィールドである可能性があります。 – msmfsd

答えて

0

答えがfindOneAndUpdateをマングースすることを目的とする改変ドット表記とパスにresponse.bodyオブジェクトを変換することでした。回答とそのtoDot関数のためのGitterの@btkostnerに感謝します。

function(req, res) { 
    // convert response to dot notation so objects retain other values 
    var dotData = toDot(req.body, '.'); 
    MySchema.findOneAndUpdate({ active: true }, dotData, function(err, myschema) { 
    ... 
} 

// author: @btcostner 
function toDot (obj, div, pre) { 
    if (typeof obj !== 'object') { 
    throw new Error('toDot requires a valid object'); 
    } 
    if (pre != null) { 
    pre = pre + div; 
    } else { 
    pre = ''; 
    } 
    var iteration = {}; 
    Object.keys(obj).forEach(function(key) { 
    if (_.isPlainObject(obj[key])) { 
     Object.assign(iteration, _this.toDot(obj[key], div, pre + key)); 
    } else { 
     iteration[pre + key] = obj[key]; 
    } 
    }); 
    return iteration; 
}; 

注:私は私のプロジェクトのためにES5にtoDot()関数を変換しなければならなかった、ここではオリジナルES6のバージョンがある:github.com/elementary/houston/blob/master/src/lib/helpers/dotNotation.js

関連する問題