使用upsert插入文档时排除查找查询字段:true

时间:2018-05-25 07:40:38

标签: mongodb mongodb-query

$('#container_id').on('ifChecked','.checkbox_class', function (event){  

}); 
  

错误:E11000重复键错误集合:geoFame.placeFollow   index:id dup key:{:ObjectId('5af19959204438676c0d5268')}

索引

db.getCollection('placeFollow').update(
{
    "_id":ObjectId("5af19959204438676c0d5268"),
    "count":{"$lt":2}
 },
 {   
     "$set":{"data":"check"}
  },
  {"upsert":true})

如果文档不存在,我想保存文档。但上面的查询是试图插入_id,这是在查询查询中给出的,它正在抛出重复键错误。如何在插入文档时排除查找查询?

1 个答案:

答案 0 :(得分:0)

核心问题当然是提供_id,但您还需要实际设置"count"字段。使用$setOnInsert可能是您想要的:

db.getCollection('placeFollow').update(
  { "count":{"$lt":2} },
  {   
     "$set":{ "data": "check" },
     "$setOnInsert": { "count": 2 }
  },
  {"upsert":true}
)

因此,您需要使用“默认”或其他预期数据进行此类操作。否则,MongoDB找不到文档,因为该字段不存在,并尝试使用与提供的_id值相同的插入。

由于您的代码目前不正确,因此您需要首先删除不使用"count"创建的文档:

db.getCollection('placeFollow').deleteOne(
  { "_id":ObjectId("5af19959204438676c0d5268") }
)

或者设置所有文档的默认值为`count。

但基本上你在使用“upsert”时不能同时使用“主键”和另一个条件,因为如果文档不符合条件,则尝试upsert,当然还有_id的现有值是独一无二的。