2013-11-09 3 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'); 
} 

В настоящее время я использую схему и код выше, чтобы создать счетчик доступа для каждой страницы. Он обновляет документы URL, которые подсчитывают общий доступ и сохраняют информацию о пользователе. пока что так хорошо. Он работает правильно.double upsert in Node.js and mongoose

Теперь я хочу добавить «счетчик: число» в массив посетителей и когда событие происходит, если пользователь уже находится в массиве посетителей, я хочу обновить его, а не нажимать новый. Но я не знаю, как сделать команду «double 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'); 
       } 
      }); 
     } 
    } 
); 

Простым, вставить, если не существует со счетчиком = 0, обновлением, если существует с увеличивающимся счетчиком на 1