覆盖Labix mgo中的默认writeConcern

时间:2015-05-06 19:40:11

标签: mongodb go mongodb-query mgo

我在Go应用程序中使用(function IIFE(){ function bar(){ return 3; } return bar(); function bar() { return 8; } })() (function IIFE(){ function bar(){ return 3; } function bar() { return 8; } return bar(); })() (function IIFE(){ function bar() { return 8; } return bar(); })() 作为mongodb驱动程序,我想知道是否有办法覆盖特定查询的默认labix mgo

关于配置的几句话:副本集有三个节点 - 一个主节点和两个副节点,writeConcernwriteConcern是默认节点。驱动程序使用readPreference一致性,这意味着所有读取都是从辅助设备完成的(当它可用时,否则 - 从主设备读取)。

有些情况下,我需要在写入数据库后立即读取更新的数据 - 并且因为上面的mongo可能会返回旧数据:

monotonic

问题是:是否可以覆盖默认的// 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并强制驱动程序等待数据写入辅助节点或从中读取一些查询的主要内容?

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

好的,经过一些研究后我得到了一个解决方案。有一种方法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()