2017-04-25 6 views
0

文書をmongoコレクションに保存する必要があります。
私は「insertedAt」と「updatedAt」日付フィールドを保存したいので、私は、私は1つのステップでそれを行うことができないと仮定し...マングース:文書を更新/保存するにはどうしたらいいですか?

これが私の最後の試みです:

my topic = new Topic(); // Topic is the model 
    topic.id = '123'; // my univocal id, !== _id 
    topic.author = 'Marco'; 
    ... 

    Topic.findOne({ id: topic.id }, function(err, doc) { 
    if (err) { 
     console.error('topic', topic.id, 'could not be searched:', err); 
     return false; 
    } 
    var now = new Date(); 
    if (doc) { // old document 
     topic.updatedAt = now; 
    } else { // new document 
     topic.insertedAt = now; 
    } 
    topic.save(function(err) { 
     if (err) { 
     console.error('topic', topic.id, 'could not be saved:', err); 
     return false; 
     } 
     console.log('topic', topic.id, 'saved successfully'); 
     return true; 
    }); 
    }); 

しかし、その後、私はレコードを複製してしまうこのよう... :-(

任意の提案?スキーマ定義ではfalseに

+0

新しいデータベースレコードを保存しない場合は、 '新しいトピック 'を作成しないでください。ちょうど 'find {_id:...'、 'doc.updatedAt = now'と' doc.save' – wostex

答えて

1

よりもむしろあなたは、私がアップサートで文書を更新する非常に簡単な方法を好む行っているものは何でもやって。このためには、モデルを使用して挿入するインスタンスを作成しないでください。手動でオブジェクトを作成する必要があります。最初にすべての文書天気をチェックします

//don't put `updatedAt` field in this document. 
var dataToSave = { 
    createdAt: new Date(), 
    id: 1, 
    author: "noor" 
    ....... 
} 

Topic.update({ id: 123 }, { $set:{ updatedAt: new Date() }, $setOnInsert: dataToSave}, { upsert: true }, function(err, res){ 
     //do your stuff here 
}) 

このクエリでは、それは、コレクション内の全新しい文書を挿入しますない場合ははい、それが唯一のudpatedAtを更新する場合のコレクションがあります。これがあなたの質問に答えるといいと思います。

+0

これは私自身が持っていたalmastの同じ解決策です:-)唯一の違いは、新しいモデル()を作成してから、アップアップする直前に、私は 'dataToSave._id = undefined;'と実行しています:-)ありがとうございます! – MarcoS

0

セットのタイムスタンプ、あなたが希望として作成時にフィールドを追加します。

参照以下のサンプルスキーマ定義:

var mongoose = require('mongoose') 
    , Schema = mongoose.Schema; 

var Topic = new Schema({ 
    id:{ 
     type:String, 
     required: true 
    }, 
    author:{ 
     type:String, 
     required: true 
    } 
},{ 
    timestamps: false 
}); 
+0

新しい文書を挿入するときにはinsertedAtを追加する必要があります:-( – MarcoS

+0

なぜそれをドキュメント作成中 So: ... topic.insertedAt = Date.now(); – ifiok

関連する問題