2014-10-30 3 views
1

В моем приложении Meteor у меня есть метод Meteor, который берет коллекцию в качестве параметра и пытается запустить команду mongo insert в этой коллекции для создания нового документа. Код запускается каждые 10 секунд, используя setInterval.Монго Вставить внутри метеорного метода?

Коллекция определяется:

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

Что происходит, что у вас есть различных коллекции на клиенте и на сервере (чтение больше на 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

Замечательный ответ, эффективный и точно то, что я искал. Спасибо, Дэн! –

-1

Я думаю, что здесь collection переменная принимает в качестве имени коллекции, если у вас есть несколько имен коллекции вы можете сделать это, как показано ниже в методах сервера

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

Спасибо за ваш ответ. Однако моя переменная коллекции не является строкой, это объект. Поэтому я не могу так проверить строку и не думаю, что это будет работать, пытаясь вставить строку. –

+0

@iAmMe: вы на [правую дорожку] (http://stackoverflow.com/a/26664357/1269037) –

0

После дальнейшего осмотра объекта коллекции, я заметил, что он имеет объект , внутри которого, в свою очередь, содержатся функции insert, update и т. д. Поэтому, регулируя код ниже решаешь эту проблему для запуска Монго команды против параметра сбора внутри метода Метеора:

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

Это напрасно направляет и весь объект на сервер и предполагает, что коллекции на клиенте одинаковы поскольку публикации находятся на сервере. Проверьте [мой ответ] (http://stackoverflow.com/a/26664357/1269037) за правильное решение. –

+0

Вы правы, отличный ответ, спасибо! –

Смежные вопросы