覆盖 Labix mgo 中的默认 writeConcern
Overriding default writeConcern in Labix mgo
我在我的 Go 应用程序中使用 labix mgo
作为 mongodb 驱动程序,我想知道是否有办法覆盖特定查询的默认 writeConcern
。
关于配置的几句话:副本集有三个节点——一个主节点和两个从节点,writeConcern
和 readPreference
是默认的。驱动程序使用 monotonic
一致性,这意味着所有读取都是从辅助设备完成的(当它可用时,否则 - 从主设备)。
在某些情况下,我需要在写入数据库后立即读取更新的数据 - 由于上述 mongo 可能 return 旧数据:
// update some data
_ := collection.Update(bson.M{"_id": "some_id"}, bson.M{"key": "value"})
// the data is still not updated when I read it immediately after update
var obj interface{}
_ := collection.Find(bson.M{"_id": "some_id"}).One(&obj)
问题是:是否可以覆盖驱动程序的默认值 writeConcern
(或默认值 consistency
)并强制驱动程序等到数据写入辅助设备或读取来自主要的一些查询?
感谢任何建议。
好的,经过一些研究,我最终找到了解决方案。有一种方法 SetMode
允许您更改特定数据库会话的默认一致性模式。在我们的应用程序中,我们每次在发出请求之前都会创建主会话的副本,然后在完成后将其关闭:
// master session is configured to use monotonic consistency
session := masterSession.Copy()
// tell mgo to read from the primary in this session
session.SetMode(mgo.Strong, true)
collection := session.DB("db").C("collection")
var obj interface{}
// now we can be sure that the following request reads the data from the primary
_ := collection.Find(bson.M{"_id": "some_id"}).One(&obj)
session.Close()
我在我的 Go 应用程序中使用 labix mgo
作为 mongodb 驱动程序,我想知道是否有办法覆盖特定查询的默认 writeConcern
。
关于配置的几句话:副本集有三个节点——一个主节点和两个从节点,writeConcern
和 readPreference
是默认的。驱动程序使用 monotonic
一致性,这意味着所有读取都是从辅助设备完成的(当它可用时,否则 - 从主设备)。
在某些情况下,我需要在写入数据库后立即读取更新的数据 - 由于上述 mongo 可能 return 旧数据:
// update some data
_ := collection.Update(bson.M{"_id": "some_id"}, bson.M{"key": "value"})
// the data is still not updated when I read it immediately after update
var obj interface{}
_ := collection.Find(bson.M{"_id": "some_id"}).One(&obj)
问题是:是否可以覆盖驱动程序的默认值 writeConcern
(或默认值 consistency
)并强制驱动程序等到数据写入辅助设备或读取来自主要的一些查询?
感谢任何建议。
好的,经过一些研究,我最终找到了解决方案。有一种方法 SetMode
允许您更改特定数据库会话的默认一致性模式。在我们的应用程序中,我们每次在发出请求之前都会创建主会话的副本,然后在完成后将其关闭:
// master session is configured to use monotonic consistency
session := masterSession.Copy()
// tell mgo to read from the primary in this session
session.SetMode(mgo.Strong, true)
collection := session.DB("db").C("collection")
var obj interface{}
// now we can be sure that the following request reads the data from the primary
_ := collection.Find(bson.M{"_id": "some_id"}).One(&obj)
session.Close()