在 Meteor.js 中,使用多个具有相同集合名称的 MongoInternals.RemoteCollectionDriver

kak*_*ais 4 mongodb meteor

MongoInternals.RemoteCollectionDriver("mongodb://#{server.ip}:#{server.port}/#{server.dbName}")
Run Code Online (Sandbox Code Playgroud)

如果我调用多个远程 MongoDB 方法并且如果有同名的集合,Meteor 会抛出类似这样的错误,“collectionName/insert is already existing...”

我认为 Meteor 在内部创建每个集合的方法,以便控制每个集合,但是由于某些原因我需要一次控制多个 MongoDB。

我怎样才能避免这种情况?

此外,我意识到我可以像这样直接使用 Npm Mongo 驱动程序,而无需涉及任何 NPM 包。

var MongoClient = MongoInternals.NpmModules.mongodb.module.MongoClient;

// Connection URL
var url = 'mongodb://localhost:27017/myproject';
// Use connect method to connect to the Server
MongoClient.connect(url, function(err, db) {
  console.log("Connected correctly to server");
  try {
    var collection = db.collection('documents');
    collection.find({}).toArray(function(err, docs){
      console.log(err);
      console.log(docs);
    });
  }
  catch(err) {
    console.log(err);
  }
  db.close();
});
Run Code Online (Sandbox Code Playgroud)

但这仍然迫使我使用 Node.js 回调样式来控制每个数据库。有什么想法可以避免这种情况吗?

aja*_*rdo 5

我一直在检查这个问题,我找到了一种方法。

我见过的连接多个数据库的解决方案,其中:

storageServerDriver = new MongoInternals.RemoteCollectionDriver("mongodb://ip:port/dbName")

@Collection = new Mongo.Collection("collection", { _driver: storageServerDriver })
Run Code Online (Sandbox Code Playgroud)

但是正如您之前提到的,对于两个同名的集合,会引发错误(Meteor 在内部通过名称识别集合,因此它会尝试覆盖已创建的集合的结构)。

无论如何,要解决此问题,您可以使用以下技巧:

storageServerDriver = new MongoInternals.RemoteCollectionDriver("mongodb://ip:port/dbName")

@CollectionTwo = storageServerDriver.open('collection') 
Run Code Online (Sandbox Code Playgroud)