使用node.js检索用于mongo查询的副本实例

我使用官方的node.js mongodb客户端 ,通过类似于以下连接string的集群执行Mongo查询: mongodb://euwest1-01,euwest1-02,uswest2-01/dbname?replicaSet=mycluster&readPreference=nearest 。 正如你所看到的,我在我的集​​群中包含一些不同的地理位置实例,“最近的”应该保证select正确的副本。

不过,我想知道哪一个被用来执行任何查询,以便我可以在每个操作日志中包含用于执行查询的mongo副本。

对光标对象进行黑客攻击,我可以用黑客的方式得到我想要的东西:

 const find = (query, callback) => { let cursor = coll.find(query); cursor.toArray((err, items) => { console.log(cursor.server.ismaster.me); callback(err, items); }); }; 

但是我觉得这样可以在任何时候打破,因为没有logging+它似乎仅限于光标的相互作用(所以我不知道如何实现一个findOne方法相同)。

有谁知道一个干净的方法来做到这一点?

您可能有兴趣使用APM界面。

http://mongodb.github.io/node-mongodb-native/2.2/reference/management/apm/

这使您可以访问由驱动程序运行的每个操作的上下文,并且确实适用于APM提供程序,但如果要跟踪或logging操作执行的方式,可能对您有用。

 var listener = require('mongodb').instrument({ operationIdGenerator: { operationId: 1, next: function() { return this.operationId++; } }, timestampGenerator: { current: function() { return new Date().getTime(); }, duration: function(start, end) { return end - start; } } }, function(err, instrumentations) { // Instrument the driver }); listener.on('started', function(event) { // command start event (see https://github.com/mongodb/specifications/blob/master/source/command-monitoring/command-monitoring.rst) }); listener.on('succeeded', function(event) { // command success event (see https://github.com/mongodb/specifications/blob/master/source/command-monitoring/command-monitoring.rst) }); listener.on('failed', function(event) { // command failure event (see https://github.com/mongodb/specifications/blob/master/source/command-monitoring/command-monitoring.rst) }); 

我想这不是最好的解决scheme,但你可以使用.eval()函数来创build一个返回server_info&result的函数,如下所示:

 db.getCollection('mycollection').eval(function construct(){ var res = db.getCollection('mycollection').find(query); var explain = res.explain()['server']; return {'server':explain,'result':res.toArray()}; })() 

它返回类似于:

 { "server" : "myservernode.mydomain:27017", "result" : [ // your query results ] }