Mongo插入流星方法?

时间:2014-10-30 19:15:54

标签: javascript mongodb meteor

在我的Meteor应用程序中,我有一个Meteor方法,该方法将集合作为参数,并尝试在该集合上运行mongo insert命令以创建新文档。代码使用setInterval每10秒运行一次。

收集定义:

My_Collection_Name = new Meteor.Collection('my_collection_name');

<小时/> 服务器代码:

var collection = My_Collection_Name;
var data = [1,2,3,'a','b','c'];
Meteor.call('createDocument', collection, data);

<小时/> 方法:

Meteor.methods({
  createDocument: function(collection, data) {
    collection.insert({
      data: data
    });
  }
});

<小时/> 但是,这会在控制台中返回以下错误:

I20141030-14:58:06.716(-4)? Exception in setInterval callback: TypeError: Object #<Object> has no method 'insert'

为什么这不起作用?是否可以将集合作为参数传递?提前谢谢!

3 个答案:

答案 0 :(得分:3)

您会在客户端和服务器上拥有不同的集合(请在Understanding Meteor publish/subscribe阅读更多内容)。依赖~invate _collection字段是有风险的。你真正想要的是确实将集合名称作为字符串传递给Meteor.call,确保服务器上的集合具有相同的变量名称,并在global对象中按名称查找集合在服务器上:

// on the client:

MyCollection = new Mongo.Collection('record-set-name');  // set server-side by .publish()
Meteor.call('createDocument', 'MyCollection', data);

// on the server:
MyCollection = new Mongo.Collection('collection-name-in-mongo');
Meteor.methods({
  createDocument: function(collectionName, data) {
    global[collectionName].insert({
      data: data
    });
  }
});

此模式由meteor-autocomplete用于pass collection names from the client to the server

Understanding Meteor publish/subscribe解释了集合名称和集合变量名称在Mongo中的关系。

答案 1 :(得分:0)

在进一步检查集合对象后,我注意到它有一个_collection对象,其中包含insertupdate等函数。因此,将代码调整到下面可以解决在Meteor方法中针对集合参数运行Mongo命令的问题:

Meteor.methods({
  createDocument: function(collection, data) {
    collection._collection.insert({
      data: data
    });
  }
});

答案 2 :(得分:-1)

我认为这里collection变量作为集合名称,如果你有很少的集合名称,你可以像下面的服务器方法那样做

Meteor.methods({
  createDocument: function(collection, data) {
    if(collection == "firstcollection")
    {
      firstcollection.insert({
        data: data
      });
   }
   else if(collection == "secondcollection")
    {
      secondcollection.insert({
        data: data
      });
   }
  }
});