Подробное объяснение хранимой процедуры монго

MongoDB

хранимая процедура

Хранимая процедура реляционной базы данных описывается как: набор операторов SQL для выполнения определенной функции, скомпилированный и сохраненный в базе данных, который пользователь выполняет, указав имя хранимой процедуры и задав параметры (если хранимая процедура имеет параметры ) это.

MongoDB предоставляет ряд решений для многих проблем, и она по-прежнему не демонстрирует слабости по характеристикам других баз данных, а ее производительность является экстраординарной. MongoDB также поддерживает хранимые процедуры, но mongoDB написана на javascript, в этом прелесть mongoDB.

MongoDB также поддерживает хранимые процедуры. Первое, что вам нужно знать о хранимых процедурах, это то, что они написаны на javascript. Возможно, это заставит вас задуматься, почему это написано на javascript, но на самом деле это вас очень удовлетворит, хранимые процедуры MongoDB хранятся в таблице db.system.js

Например:

Рассчитать значение X + Y

function test(x,y){

return x+y;
}

Определить общее количество запросов Хранимая процедура

function findTotal(){
return db.user.find().count();
}

Скомпилируйте и сохраните

db.system.js.save({"_id":"test","value":function test(x,y){return x+y;}});
db.system.js.save({"_id":"findTotal","value":function findTotal(){return db.user.find().count();})

выполнить возврат

// 1
WriteResult({
	"nMatched" : 1,
	"nUpserted" : 0,
	"nModified" : 0,
	"writeConcernError" : [ ]
})

оценочная функция

Логика хранимой процедуры может быть определена прямо в ней и вызываться одновременно без предварительного объявления!

db.eval("function test(x,y){return 2 + 4;}");  // 6 
Общее количество данных в таблице запроса
db.eval("function total(){ return db.user.find().count();}");  //25

Просмотреть все хранимые процедуры

db.system.js.find();

在这里插入图片描述

Результаты

Всего

db.eval('findTotal()');

在这里插入图片描述

db.eval('test(2,4)');

在这里插入图片描述

mongodb выполнить хранимую процедуру

Хранимая процедура mongodb написана на языке js, а java может вызывать js-скрипт!

java выполняет файл сценария js:

/**
 * 调用mongodb存储过程 js脚本文件
 * @return
 */
@Test
public void test(){
    ScriptOperations scriptOps = mongoTemplate.scriptOps();
    Object findTotal = scriptOps.call("findTotal");//执行服务器端脚本
    //call(String script,Object...args)参数放在脚本名称之后
    Object test = scriptOps.call("test",4,4);//执行服务器端脚本

    System.out.println(Double.parseDouble(findTotal.toString()));  //25条
    System.out.println(Double.parseDouble(test.toString()));       // 8 
 
}

Обратите внимание, что скрипт не может быть нулевым или "" или он будет ненормальным!

Метод в mongoTemplate возвращает объект DefaultScriptOperations:

MongoTemplate реализует интерфейс MongoOperations.

Методы в MongoTemplate

public ScriptOperations scriptOps() {
    return new DefaultScriptOperations(this);
}
метод вызова

интерфейс ScriptOperations

@Nullable
Object call(String var1, Object... var2);

Класс реализации:

класс DefaultScriptOperations реализует интерфейс ScriptOperations

Метод строительства

public DefaultScriptOperations(MongoOperations mongoOperations) {
    Assert.notNull(mongoOperations, "MongoOperations must not be null!");
    this.mongoOperations = mongoOperations;
}

метод

public Object call(final String scriptName, final Object... args) {
    Assert.hasText(scriptName, "ScriptName must not be null or empty!");
    return this.mongoOperations.execute(new DbCallback<Object>() {
        public Object doInDB(MongoDatabase db) throws MongoException, DataAccessException {
            return db.runCommand(new Document("eval", String.format("%s(%s)", scriptName, DefaultScriptOperations.this.convertAndJoinScriptArgs(args)))).get("retval");
        }
    });
}

Вызывая метод scriptOps() для возврата ссылки MongoOperations, фактически mongoTemplate выполняет метод выполнения. В классе реализации интерфейса ScriptOperations DefaultScriptOperations вызывает метод вызова интерфейса ScriptOperations и, наконец, передает тип параметра проверки и преобразование в соответствии с другими методами класса DefaultScriptOperations convertAndJoinScriptArgs. Наконец, вызовите нижнюю команду runCommand, чтобы выполнить хранимую процедуру.