2013-11-09 65 views
2
var urlSchema = new Schema ({ 
url : String, 
visitor : [{name: String,date: Date}], 
counter : Number 
}); 

var url = mongoose.model('url',urlSchema); 
var domain = blah blah; 
var conditions = { url: domain }; 
var update = { $inc : {counter:1}, 
       $push : { visitor: [{ 
        name: data.username, 
        date: new Date() 
        }] 
       } 
      }; 
var options = {upsert: true}; 
url.update(conditions,update,options,function(err){ 
if(err){ 
    console.log(err); 
}else{ 
    console.log('A domain successfully added to DB'); 
} 

目前我使用上面的架構和代碼,以使每個頁面的訪問計數器。 它upserts其計數累計獲得和保持訪問用戶信息的URL文件。 到目前爲止好它的正常工作。雙UPSERT和貓鼬

現在我想在visitor數組中添加「counter:Number」,當事件發生時,如果用戶已經在visitor數組中,我想更新它,而不是推新的。 但我不知道如何使「雙UPSERT」命令。 反正是有這樣做嗎?

回答

0

它可能是一個有點困難甚至是不可能執行滿足您的條件查詢。我已複製您的情況與下面的查詢

url.findOne({'url': 'search.php', 'visitor.name': "JohnDoe"}, 
    function (err, visitor) { 
     if (visitor) { 
      url.update(
       { 
        'url': 'search.php', 'visitor.name': "JohnDoe" 
       }, 
       { 
        $inc: {'visitor.$.counter': 1, 'counter': 1} 
       }, 
       function(err, result) { 
        if (err) { 
         console.log("Error occured") 
        } else { 
         console.log("Success"); 
        } 

       }); 
     } else { 
      var conditions = { url: 'search.php' }; 
      var update = { $inc : {counter:1}, 
       $push : { visitor: [{ 
        name: data.username, 
        date: new Date(), 
        counter: 0 
       }] 
       } 
      }; 
      var options = {upsert: true}; 
      url.update(conditions,update,options,function(err){ 
       if(err){ 
        console.log(err); 
       }else{ 
        console.log('A domain successfully added to DB'); 
       } 
      }); 
     } 
    } 
); 

簡單,如果1

與遞增計數器存在插入如果不與計數器= 0存在,更新