为了账号安全,请及时绑定邮箱和手机立即绑定

使用 mgo 更新到分片 MongoDB 错误“完整的分片键必须在更新对象中才能收集:...”

使用 mgo 更新到分片 MongoDB 错误“完整的分片键必须在更新对象中才能收集:...”

Go
暮色呼如 2021-07-14 16:01:36
使用用于 MongoDB的Labix mgo API,我正在尝试对分片集合执行增量操作。我可以使用通常的 mgo.Change 结构在未分片的集合上执行此操作,但是当我尝试在分片集合上执行此操作时,出现错误:full shard key must be in update object for collection: db_name.collection_name适用于未分片集合的原始代码如下所示:            change := mgo.Change{                ReturnNew: true,                Upsert: true,                Update: bson.M{                    "$setOnInsert": bson.M{                        "ci": r.Ci,                        "dt": r.Dt,                        "zi": r.Zi,                    },                    "$inc": &data,                },            }            _, err := collection.Upsert(bson.M{"_id": id, "ci": r.Ci, "dt": r.Dt, "zi": r.Zi}, change); if err != nil {                log.Println("FAILURE", err)            }但是,当我切换到分片集合时,在键上分片时{ci: 1, dt: 1, zi: 1}出现上述错误。在尝试调试时,我试图弄清楚 mgo 幕后发生了什么,并尝试直接插入 mongo 终端。db.collection.update({ "_id" : "98364_2013-12-11", "ci" : "16326", "dt" : "2013-12-11", "zi" : "98364"}, {$setOnInsert: { "ci" : "16326", "dt" : "2013-12-11", "zi" : "98364"} , $inc: {test :1}}, { upsert: true });然而,这给我带来了一个单独的错误:Can't modify shard key's value. field: ci: "16326" collection: db.collection这是我认为一旦我弄清楚我的初始错误就必须弄清楚的事情,但对我来说似乎很奇怪它用 $setOnInsert 命令抛出这个错误,因为它不应该修改值,只需在初始插入时设置它。当我删除命令的 $setOnInsert 部分时,所有错误都会消失,但我需要一种方法来确保这些值得到设置,因为它们在我编写的查询中很重要以取回数据。回到我的主要问题:我确实发现当我在与MongoDB终端交互时重新排列更新和upsert文档的顺序时,我得到了我在通过mgo时得到的错误,所以我试图非常严格地控制通过切换到 bson.D 在 mgo.Change 结构中传递的文档顺序:
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信