最好不要直接在表达式字符串中使用值,而是将值与表达式字符串分离。这可以通过在表达式字符串中使用参数和 bind()
函数来绑定值到参数来实现。
参数可以使用以下方式指定:匿名和命名。
参数类型 |
语法 |
示例 |
允许在 CRUD 操作中使用 |
允许在 SQL 字符串中使用 |
---|---|---|---|---|
匿名 |
? |
'age > ?' |
否 |
是 |
命名 |
:<name> |
'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
不允许。
除了直接使用 bind()
和 execute()
或 execute()
绑定和执行 CRUD 操作外,还可以将 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();