3.3 參數綁定

好的做法是將數值從運算式字串中分離出來,而不是直接在運算式字串中使用數值。這會使用運算式字串中的參數,並使用 bind() 函式將數值繫結至參數。

可以使用以下方式指定參數:匿名和具名。

參數類型

語法

範例

允許在 CRUD 操作中使用

允許在 SQL 字串中使用

匿名

?

'age > ?'

具名

:<名稱>

'age > :age'

以下範例示範如何在 execute() 函式之前使用 bind() 函式。針對每個具名參數,提供一個包含參數名稱及其數值的引數給 bind()。傳遞給 bind() 的參數數值配對順序並不重要。此範例假設 test 綱要已指派給變數 db,並且存在集合 my_collection

// Collection.find() function with fixed values
var myColl = db.getCollection('my_collection');

var myRes1 = myColl.find('age = 18').execute();

// Using the .bind() function to bind parameters
var myRes2 = myColl.find('name = :param1 AND age = :param2').bind('param1','Rohit').bind('param2', 18).execute();

// Using named parameters
myColl.modify('name = :param').set('age', 55).
        bind('param', 'Nadya').execute();

// Binding works for all CRUD statements except add()
var myRes3 = myColl.find('name like :param').
        bind('param', 'R%').execute();

X DevAPI 中不支援匿名預留位置。此限制改善了使用多個使用預留位置的方法的 CRUD 命令鏈中的程式碼清晰度。無論使用哪種 bind() 語法變體,參數和預留位置之間總是根據參數名稱明確關聯。

CRUD 命令鏈的所有方法都會為預留位置形成一個命名空間。在以下範例中,會鏈結 modify()set()。這兩個方法都採用帶有預留位置的運算式。預留位置會參照一個合併的命名空間。兩者都使用一個名為 :param 的預留位置。對 bind() 的單一呼叫,其中包含一個名為 :param 的名稱數值參數,用於將預留位置數值指派給鏈結方法中 :param 的兩個出現位置

// one bind() per parameter
var myColl = db.getCollection('relatives');
var juniors = myColl.find('alias = "jr"').execute().fetchAll();

for (var index in juniors){
  myColl.modify('name = :param').
    set('parent_name',mysqlx.expr(':param')).
    bind('param', juniors[index].name).execute();
}

不允許具名參數使用以數字開頭的名稱。例如,不允許使用 :1one:1

準備 CRUD 陳述式

也可以將 CRUD 操作物件儲存在變數中以供日後執行,而不是直接使用 bind()execute()execute() 繫結和執行 CRUD 操作。

這樣做的好處是可以將多組變數繫結至運算式字串中定義的參數,因此在執行大量相似操作時可以獲得更好的效能。此範例假設 test 綱要已指派給變數 db,並且存在集合 my_collection

var myColl = db.getCollection('my_collection');

// Only prepare a Collection.remove() operation, but do not run it yet
var myRemove = myColl.remove('name = :param1 AND age = :param2');

// Binding parameters to the prepared function and .execute()
myRemove.bind('param1', 'Leon').bind('param2', 39).execute();
myRemove.bind('param1', 'Johannes').bind('param2', 28).execute();

// Binding works for all CRUD statements but add()
var myFind = myColl.find('name like :param1 AND age > :param2');

var myDocs = myFind.bind('param1', 'L%').bind('param2', 20).execute();
var MyOtherDocs = myFind.bind('param1', 'J%').bind('param2', 25).execute();