2016-01-24 100 views
0

我想这一点:猫鼬findOneAndUpdate总是创建新文档

var query= {'boardUrl':data.url,'shapes':data.canvas}; 
    Shape.findOneAndUpdate(query,query,{upsert:true},function(err,doc){ 
     if (err){ 
     console.log(err); 
     } 

    }); 

我要的是检查,如果在我的Shapes集合已经有与具有相同boardUrl和更新的文档。如果不存在,请使用boardUrl和形状创建一个新文档。

我的外形集合如下:被随时创建

var shapeSchema = mongoose.Schema({ 
boardUrl: String, 
shapes: String 
}); 

一个新的文档。你们可以看看我的查询有什么问题吗? 谢谢

+0

要查询找到数据'**和''形状',但你说,你只想通过'boardUrl'来检查。 – qqilihq

+0

哦谢谢!如果你将这个答案作为答案,我可以选择它作为答案 –

+0

很高兴它的工作,已经有了类似的答案,只需选择这一个;-) – qqilihq

回答

1

如果我明白了,你的条件还包括一个你不想要的'shapes'的平等。删除:你的条件应该只检查'boardUrl'

尝试:

var condition = {'boardUrl':data.url}; 
var doc = {'boardUrl':data.url,'shapes':data.canvas}; 
Shape.findOneAndUpdate(condition,doc,{upsert:true},function(err,doc){ 
    if (err){ 
    console.log(err); 
} 
}); 

这样一来,当找不到data.url一个新的文件将被插入。当它被发现时,shapes将被更新为data.canvas

希望这是你想要的东西

-1

一个方法是通过验证,可以用户findOrCreate方法,如果有更新,否则在数据库中`boardUrl进入新的条目

Shape.findOrCreate({ 
where: shapeCondition 
}) 
.spread(function (Shape, created) { 
if (created == false) { 
    (write update query) 
    return callback(err); 
} else { 

    return callback(null, data); 
} 

}).catch(function (err) { 
err.exception = "error message"; 
return callback(err); 
});