并发写Mongo / Mongoose创建重复项

时间:2017-02-16 08:57:39

标签: node.js mongodb mongoose

nodejs + mongoose中,我有这个架构和功能:

var storeSchema = new Schema({      
    sensor_id:  {type: String, required: true},
    dateString:  {type: String, required:true},
    created:    {type: Date},
    values:     {}
});
  storeSchema.index({sensor_id:1,dateString:1},{unique:true});
// sensorId and stringDate come from outside
//
function(sensorId,stringDate)
{
   Store.findOneAndUpdate(
                {
                    sensor_id: sensorId, 
                    dateString:stringDate,                       
                }, 
                updated,
                {
                    new:false
                },
                function(err, sensorResult){
                    if(err){
                        console.log(err);
                        return;
                    }
                    else
                    {   
                        if (sensorResult === null)
                        {
                            var newRecord = {                                       
                                    sensor_id:sensorId,
                                    dateString:stringDate,
                                    created:new Date(),
                            };

                            Store.create(newRecord,function(err){
                            });                         
                        }                        
                    }
                }
            );
   }

我的脚本只检查是否存在记录:如果不存在,则创建新记录,否则更新旧记录。 要保存的数据来自另一个脚本(基本上是服务器)。

数据包是一个包含sensorIdstringDate的JSON对象。 但是,如果我向脚本发送两个相同的“数据包”,它会存储两个重复的记录,即具有相同的dateString和sensorId。

1 个答案:

答案 0 :(得分:0)

如下更改查询解决了问题:

 Store.findOneAndUpdate(
                {
                    sensor_id: sensorId, 
                    dateString:stringDate,                       
                }, 
                updated,
                {
                    upsert:true
                },
                function(err, sensorResult){
                    if(err){
                        console.log(err);
                        return;
                    }
                    else

                }
            );