所述mgo.Change类型是特定于Query.Apply方法,该方法运行的MongoDB findAndModify命令并执行任何所支持的修改一次。所述的Upsert方法,在另一方面,需要将被直接提供给MGO / BSON用于编组的修改文件。无论您是通过Query.Apply(在mgo.Change字段中)还是通过Collection.Upsert或Collection.Update方法提供它们,这些修改文档都具有相同的格式。Update
因此,导致观察到的错误是因为它试图mgo.Change用作插入的普通结构(换句话说,具有键“returnnew”等的文档),这绝对不是您想要的。例如,您提供的 shell 命令相当于使用 mgo 直接翻译:
type M map[string]interface{}
err := collection.Upsert(
M{
"_id": "98364_2013-12-11",
"ci": "16326",
"dt": "2013-12-11",
"zi": "98364",
},
M{
"$setOnInsert": M{"ci": "16326", "dt": "2013-12-11", "zi": "98364"},
"$inc": M{"test": 1},
},
)
尽管如此,这仍然是坏的,但出于不同的原因。正如错误消息中提到的服务器,这是尝试第二次设置分片键。需要注意的是一个UPSERT操作将利用查询文档中提供的字段,以及合并这两个查询文件和修改文件创建插入的最后文件。这意味着$setOnInsert文档中的分片键字段与查询文档中的分片键字段是冗余的。
我将改进该领域的文档,以减少人们因使用mgo.Change. 抱歉,添麻烦了。
一只名叫tom的猫
相关分类