Mongodb应该在应该更新的时候进行插入

时间:2019-04-17 09:50:57

标签: mongodb mongodb-query

我正在使用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 ,而应该只插入一个文档并在第二个实例上进行了更新。

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 }
);