mongodb fast upsert创建新文档

时间:2016-07-08 14:34:31

标签: node.js mongodb mongoose mean-stack

我有一个场景,我需要保持日期和计数。在某些情况下,计数需要非常快地增加。

我正在使用以下代码来增加计数:

var today = new Date();
today.setHours(0,0,0,0);
MyModel.update({date:today},{$inc:{count:1}},{upsert:true}).exec(function(err,result)
{
    if(err)
        console.error(err);
});

但有时当函数调用速度极快时,upsert会创建多个新文档。

我第一次有200次upserts,它执行了以下操作:

/* 1 */
{
    "_id" : ObjectId("577fb98670e5b643e77584ce"),
    "date" : ISODate("2016-07-07T18:30:00.000Z"),
    "count" : 197
}

/* 2 */
{
    "_id" : ObjectId("577fb98670e5b643e77584cf"),
    "date" : ISODate("2016-07-07T18:30:00.000Z"),
    "count" : 1
}

/* 3 */
{
    "_id" : ObjectId("577fb98670e5b643e77584d0"),
    "date" : ISODate("2016-07-07T18:30:00.000Z"),
    "count" : 1
}

/* 4 */
{
    "_id" : ObjectId("577fb98670e5b643e77584d1"),
    "date" : ISODate("2016-07-07T18:30:00.000Z"),
    "count" : 1
}

除了提前创建文档之外,还有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

修改

正如考虑到这一点 - 您可以使用_id值设置data字段,因此首先会创建,然后下一个将获得duplicated key exception,您可以重试该操作。

结束编辑

由于此调用来自异步环境,因此前4个调用已执行且无法找到值 - 因此创建了新文档,然后将所有更新重定向到第一个创建的文档。

如果我们首先尝试创建文档 - 我们仍然可以在这里遇到相同的问题,因此需要创建文档,让我们提前几分钟说出来以避免竞争。

欢迎任何评论!

修改 你在那个领域创建了一个索引吗?

以下屏幕截图是使用_id字段作为唯一时间值时间

enter image description here

这一个是你创建唯一索引(并确保它被创建)

enter image description here