2014-10-30 94 views
1

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

定义集合:

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


Server代码:

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

会发生什么事是,你必须在客户端和服务器上不同集合(读更多在Understanding Meteor publish/subscribe)。依靠〜私人_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 
    }); 
    } 
}); 

这个模式被流星自动完成使用到pass collection names from the client to the server

Understanding Meteor publish/subscribe解释了Mongo中集合名称和集合变量名称是如何相关的。

+1

精彩的回答,高效率,正是我在寻找的。谢谢丹! – 2014-10-31 05:00:59

-1

我觉得这里collection变量正在为一个集合名称,如果你有几集的名字,你可以像下面的服务器方法

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

感谢您的回复。但是,我的集合变量不是一个字符串,它是一个对象。所以我不能像那样进行字符串检查,也不认为它试图插入字符串。 – 2014-10-30 19:26:38

+0

@iAmMe:你在[正确的轨道](http://stackoverflow.com/a/26664357/1269037) – 2014-10-30 22:21:56

0

后的集合对象的进一步检查,我注意到,它有一个_collection对象,其中又包含insert,update等功能。因此,代码调整到下面解决问题运行蒙戈命令对流星方法内集合参数:

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

这不必要地将整个对象传递给服务器,并假定客户端上的集合被命名为相同因为出版物在服务器上。检查[我的答案](http://stackoverflow.com/a/26664357/1269037)的正确解决方案。 – 2014-10-30 22:24:18

+0

你是对的,很好的答案,谢谢! – 2014-10-31 05:02:27