Выполнение mongodb-скриптов через mongoid Rails

1

У меня есть mongo db script в файле js:

query.js

//conn = new Mongo();
//db = conn.getDB("dbName");
functionFoo = function (arg){
    //----process arg
}

Также у меня есть массив args, известный как args_array (который я извлекаю из базы данных с помощью mongoid), для которого я хочу сделать что-то вроде этого:

args_array.each do |arg|
   //some how call functionFoo(arg) from the query.js file
end

возможно ли это в рельсах?

Я могу выполнить файл с терминала, но я хочу его обернуть в моем приложении, чтобы я мог использовать его из консоли rails.

  • 0
    Похоже, вы пытаетесь вызывать JavaScript-запросы непосредственно в Ruby; вам придется пройти через интерпретатор JavaScript (например, оболочку mongo ), чтобы это имело смысл. Каковы ваши реальные требования - вам просто нужно оценить список сохраненных запросов в файле, или они должны быть функциями JavaScript?
  • 0
    У меня есть функция javascript, которая обновляет множество документов, а не список запросов. Если бы это был независимый скрипт, я мог бы сделать это с помощью exec , но функция принимает аргумент из массива ruby, это мой точная проблема
Показать ещё 3 комментария
Теги:
mongoid

2 ответа

2

Я знаю этот старый вопрос, но в случае, если вам все еще нужен ответ или любой другой. Этот ответ работает с gem mongo ~> 2.3.

Ключ к ответу вам не нужен mongoid в этом случае - в моем случае я использую его для модели rails, поэтому я использую mongoid (5.1.0) только для получения соединения DB db = Mongoid.default_client.database - или вы можете получить/создать базы данных с использованием драгоценности манго.

Чтобы выполнить javascript в базе данных, вам нужно вызвать метод command db.command({ eval: 'js' }) или db.command({ eval: 'function(n){return db.projects.find({name: n}).toArray();}', args: ['beskhai'], nolock: true })

Чтобы получить результат, вы можете вызвать .documents db.command(...).documents. Возврат - это хеш {retval: это будет возврат вас script, ok: is 1 if success} возвращаемый объект вызова command [Mongo::Operation::Result] https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/operation/result.rb.

Эта статья может помочь вам.

0

Я использую MongoID 6.0.1, и легко запросить все, что вы хотите:

    db ||= Mongoid.default_client.database
    f = """
    functionFoo = function (arg){
    //----process arg
    }
    """
    result = db.command({:$eval => f, args: [arg1, arg2, ...arg_n], nolock: true})
    @result_data = result.first['retval']

Это не только функция, просто каждая вещь, которую вы хотите сделать с командой. Мой пример:

db ||= Mongoid.default_client.database
f = """
var collectionNames = db.getCollectionNames(), stats = [];
collectionNames.forEach(function (n) { stats.push(db[n].stats()); });
stats = stats.sort(function(a, b) { return b['size'] - a['size']; });
return stats;
"""
result = db.command({:$eval => f, args: [], nolock: true})
@result_data = result.first['retval']

Ещё вопросы

Сообщество Overcoder
Наверх
Меню