循环更新许多文档会创建多个相同的文档

时间:2019-09-10 08:23:38

标签: node.js mongodb

好吧,在mapReduce之后,我们遇到了这种情况,我们有一系列要向上插入DB的结果。据我所知upsert创建新文档,如果它不存在,upsert标准是

{ productId: ObjectId(), date: ISODate() }

我要更新

results.forEach(r => {
  await db.collection(collectionName).update(query, update, { upsert: true });
});

我期望的是每个productId和日期只有1个文档,但是每天很少(比如说大约4个)具有相同productId和日期的文档。就像在同一时间执行了很少的第一次迭代,并同时检查了这种文档是否存在,否则将创建一个。

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在MongoDB上的Upsert操作为not atomic。这里from="0 75 55" to="360 75 55"不会按顺序进行操作,因为<svg width="500" height="300"> <defs> <g id="myGroup"> <polygon points="50,5 100,5 125,30 125,80 100,105 50,105 25,80 25, 30" style="stroke:#747373; fill:#cc3333; stroke-width: 3;"/> <text x=40 y=65 font-family="san-serif" font-size="30px" fill="white"> STOP </text> </g> </defs> <use xlink:href="#myGroup" transform="translate(0,0)"></use> <use xlink:href="#myGroup" transform="translate(250, -20) rotate(90)"></use> <use xlink:href="#myGroup" transform="translate(150, 220) rotate(180)"></use> <g transform="translate(120,110)"> <use xlink:href="#myGroup"> <animateTransform attributeName="transform" type="rotate" from="0 75 55" to="360 75 55" begin="0s" dur="1s" repeatCount="indefinite" /> </use> </g> </svg>不会在诺言时等待其回调完成。

您可以使用普通的for循环来顺序执行操作(尽管我不知道forEach变量在这里的用途)

r

这样操作将一个接一个地完成。