2017-04-25 165 views
0

我需要將文檔保存到mongo集合中。
我想保存「insertedAt」和「updatedAt」日期字段,所以我想我不能這樣做在一個步驟......貓鼬:我如何更新/保存文檔?

這是我最後一次嘗試:

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; 
    }); 
    }); 

但這樣,我結束了重複記錄... :-(

任何建議?

+0

如果您不打算保存新的數據庫記錄,請勿設置「新主題」。只要'find {_id:...',然後'doc.updatedAt = now'和'doc.save' – wostex

回答

1

,而不是做你所做的一切,我更喜歡一個很簡單的方法來與UPSERT更新文件。爲此,您需要牢記不要使用該模型創建要插入的實例。您需要手動創建一個對象。

//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相同的解決方案我自己已經與... :-)唯一的區別是,我創建我的數據new Model(),然後,在插入之前,我會這樣做:'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

爲什麼不將它添加到 因此: ... topic.insertedAt = Date.now(); – ifiok