我正在使用upsert查询来插入/更新集合中的文档,但是该查询并不总是可靠地upsert。有时它应该更新时插入另一个文档。您可以在下面看到查询- Alex指出后更新了查询-
db.test.update(
{ departmentID: "1",
storeID: "1",
customerID: "1"},
{
$set: {
name: "Andy",
rating: 1,
score: 1
},
$setOnInsert: {
departmentID: "1",
storeID: "1",
customerID: "1"
}
},
{ upsert: true }
);
该查询通常有效,但是有时最终发生是当上述查询快速连续运行(间隔为0.004秒)时,该查询最终插入了两个文档,其中包含DepartmentID-1,storeID-1和customerID-1 ,而应该只插入一个文档并在第二个实例上进行了更新。
答案 0 :(得分:1)
https://docs.mongodb.com/manual/reference/method/db.collection.update/#use-unique-indexes非常清楚:
为避免多次插入同一文档,请仅使用upsert:如果查询字段具有唯一索引,则为true。
更新
由于Neil Lunn指出了该查询,因此该查询几乎没有其他问题。 查询结果中使用的replace document syntax插入了以下文档:
{
"_id" : ObjectId(....),
"name" : "Andy",
"rating" : 1.0,
"score" : 1.0
}
此文档没有任何DepartmentID,storeID或customerID,并且在连续查询更新查询时与过滤器不匹配。即对一个空集合运行相同的查询5次将插入5个文档。
正确的查询应使用update individual fields语法以及$ set和$ setOnInsert的组合:
db.test.update(
{ departmentID: "1",
storeID: "1",
customerID: "1"},
{
$set: {
name: "Andy",
rating: 1,
score: 1
},
$setOnInsert: {
departmentID: "1",
storeID: "1",
customerID: "1"
}
},
{ upsert: true }
);