title: Mongoose duplicate key error with upsert
body: <p>I have problem with duplicate key.
  Long time can`t find answer. Please help me solve this problem or explain why i get duplicate key error.</p>
  
  <pre><code>Trace: { [MongoError: E11000 duplicate key error collection: project.monitor index: _id_ dup key: { : 24392490 }]
  name: 'MongoError',
  message: 'E11000 duplicate key error collection: project.monitor index: _id_ dup key: { : 24392490 }',
  driver: true,
  index: 0,
  code: 11000,
  errmsg: 'E11000 duplicate key error collection: project.monitor index: _id_ dup key: { : 24392490 }' }
  at /home/project/app/lib/monitor.js:67:12
  at callback (/home/project/app/node_modules/mongoose/lib/query.js:2029:9)
  at Immediate.&lt;anonymous&gt; (/home/project/app/node_modules/kareem/index.js:160:11)
  at Immediate._onImmediate (/home/project/app/node_modules/mquery/lib/utils.js:137:16)
  at processImmediate [as _immediateCallback] (timers.js:368:17)
  </code></pre>
  
  <p>but in monitor i use upsert, so why i get duplicate error??</p>
  
  <p><strong>monitor.js:62-70</strong></p>
  
  <p>monitor schema</p>
  
  <pre><code>var monitorSchema = db.Schema({
     _id      : {type: Number, default: utils.minute},
     maxTicks : {type: Number, default: 0},
     ticks    : {type: Number, default: 0},
     memory   : {type: Number, default: 0},
     cpu      : {type: Number, default: 0},
     reboot   : {type: Number, default: 0},
  streams  : db.Schema.Types.Mixed
  }, {
  collection: 'monitor',
  strict: false
  });
  </code></pre>
  
  <p>index</p>
  
  <pre><code>monitorSchema.index({_id: -1});
  Monitor = db.model('Monitor', monitorSchema);
  </code></pre>
  
  <p>and increase by property</p>
  
  <pre><code>exports.increase = function (property, incr) {
      var update = {};
      update[property] = utils.parseRound(incr) || 1;
      Monitor.update({_id: utils.minute()}, {$inc: update}, {upsert: true}, function (err) {
          if (err) {
              console.trace(err);
          }
      });
  };
  </code></pre>
  
  <p><strong>utils.js</strong></p>
  
  <pre><code>exports.minute = function () {
      return Math.round(Date.now() / 60000);
  };
  
  exports.parseRound = function (num, round) {
      if (isNaN(num)) return 0;
      return Number(parseFloat(Number(num)).toFixed(round));
  };
  </code></pre>