2016-10-05 12 views
3

私は次のようなオブジェクトを持っています。mongoose findOneAndUpdateはオブジェクトのみを追加します

var exObj = { 'title' : 'name1'}; 

それらのいくつかを今、私は時々、データを別のプロパティを追加したい(私は名前で参照したいようでない配列)オブジェクトのdataプロパティを持っていると

exObj = { 
    title : 'name2', 
    data : { 
     prop1 : 'prop1', 
     prop2 : 'prop2' 
    } 
    } 

のように見えますデータプロパティが存在することがありますが、時にはそうではありませんが、プロパティ(addedProp)を追加して保存したいので、これで終了します。

exObj = { 
    title : 'name2', 
    data : { 
     prop1 : 'prop1', 
     prop2 : 'prop2', 
     addedProp : 'value' 
    } 
    } 

findOneAndUpdateを使用すると、オブジェクト全体を渡すように見えるだけです。このようなものは私が現在行っていることです。

var data = {}; 
data.addedProp = value; 

Collection.findOneAndUpdate({ 
    title: 'name2' 
}, { 
    data 
}, { 
    upsert: true 
}) 
.exec(function(err) { 
    if (err) { 
    console.log(err); 
    } else { 
    console.log('Updated'); 
    } 
}); 

明らかに、これは存在するデータオブジェクトを上書きします。 findOneAndUpdateを実行してオブジェクトに意味のある変更を加える正しい方法は何ですか?私はtoObject()にキャストしようとしましたが、次に.save()を実行するための適切なmongooseオブジェクトがありません。

さらなる説明を追加します。これは私が知っている単純な特性(そしてうまく働いた)のために働いていました。 プロパティを追加する前にプロパティの値があるかどうか確認する必要がある値を追加したい場合があります。

だからこのようなものです。

Collection.findOneAndUpdate({ 
     field: val 
     }, { 
     if (tObj.title) { 
     title = tObj.title; 
     } 

     if (tObj.date) { 
     release_date = tObj.date; 
     } 

     if (tObj.name) { 
     name = tObj.name; 
     } 
    }, { upsert: true 
    }) 
    .exec(function(err) { 
    if (err) { 
    //handler 
    } else { 
    //handler 
    } 
    }); 
+0

'Collection.findOneAndUpdate({" title ":" name2 "}、{" data ":データ}、{upsert:true})でしたか? (コールバック) '? – chridam

答えて

0

あなたが供給フィールドに基づいて更新オブジェクトを構築し、埋め込まれたオブジェクト内の特定のフィールドをターゲットにdot notationを使用する必要があります。

var update = {}; 
if (tObj.title) { 
    update.title = tObj.title; 
} 
if (tObj.data) { 
    if (tObj.data.prop1) { 
     update['data.prop1'] = tObj.data.prop1; 
    } 
    if (tObj.data.prop2) { 
     update['data.prop2'] = tObj.data.prop2; 
    } 
    if (tObj.data.addedProp) { 
     update['data.addedProp'] = tObj.data.addedProp; 
    } 
} 

Collection.findOneAndUpdate({ 
    title: 'name2' 
}, { 
    $set: update 
}, { 
    upsert: true 
}) 
.exec(function(err) { 
+0

私はこれらの追加されたプロパティの周りのいくつかの値のチェックを追加する方法が表示されません、私の更新された質問を確認できますか? –

+0

@ dj.ldn更新された回答を参照してください。 – JohnnyHK

1

あなたの質問は最初に困難なように見えるが、解決策は非常に簡単です、あなたは配列を使用していないので、$ or upsertを使う必要はありません。したがって、位置演算子やupsertは必要ありません。以下のコードを使用することができます。

Collection.findOneAndUpdate({ 
    title: 'name2' 
},{ 
    $set:{"data.prop3":"new prop3"} 
}) 
.exec(function(err) { 
    if (err) { 
    console.log(err); 
    } else { 
    console.log('Updated'); 
    } 
}); 

prop3が存在しない場合は追加され、存在する場合は更新されます。私はあなたのローカルdbのコードをupdateとfindOneAndUpdateでチェックしました

関連する問題