获取数据项的操作会返回一个游标,可以使用该游标从结果集中消费这些数据项。可以使用 Collection.find()
、Table.select()
和 Session.sql()
从数据库中读取数据项。Collection.find()
返回包含文档的数据集,而 Table.select()
和 Session.sql()
分别返回包含行的数据集。
所有结果集都实现了统一的迭代其数据项的方式。统一的语法支持使用 fetchOne()
一次获取一个项,或使用 fetchAll()
检索所有项的列表。fetchOne()
和 fetchAll()
遵循仅向前迭代语义。实现 X DevAPI 的连接器可以在其之上提供更高级的迭代模式以匹配常见的本机语言模式。
以下示例展示了如何使用 fetchOne()
循环遍历所有文档以访问 Collection.find()
操作返回的文档。
第一次调用 fetchOne()
会返回找到的第一个文档。所有后续调用都会将内部数据项迭代器游标递增一个位置,并返回找到的项,使第二次调用 fetchOne()
返回找到的第二个文档(如果有)。当读取最后一个数据项并再次调用 fetchOne()
时,将返回 NULL
值。这确保了显示的基本 while 循环适用于所有支持此类实现的语言。
使用 fetchOne()
时,无法将内部数据项游标重置为第一个数据项以重新开始读取数据项。已使用 fetchOne()
获取过一次的数据项(这里是一个文档)可能会被连接器丢弃。数据项的生命周期与数据集分离。从连接器角度来看,项在被获取时就被调用方消费。此示例假定测试模式存在。
MySQL Shell JavaScript 代码
var myColl = db.getCollection('my_collection');
var res = myColl.find('name like :name').bind('name','L%').
execute();
var doc;
while (doc = res.fetchOne()) {
print(doc);
}
MySQL Shell Python 代码
myColl = db.get_collection('my_collection')
res = myColl.find('name like :name').bind('name','L%').execute()
doc = res.fetch_one()
while doc:
print(doc)
doc = res.fetch_one()
C# 代码
var myColl = db.GetCollection("my_collection");
var res = myColl.Find("name like :name").Bind("name", "L%")
.Execute();
DbDoc doc;
while ((doc = res.FetchOne()) != null)
{
Console.WriteLine(doc);
}
Python 代码
my_coll = db.get_collection('my_collection')
res = my_coll.find('name like :name').bind('name', 'L%').execute()
doc = res.fetch_one()
while doc:
print(doc)
doc = res.fetch_one()
Java 代码
Collection myColl = db.getCollection("my_collection");
DocResult res = myColl.find("name like :name").bind("name", "L%")
.execute();
DbDoc doc;
while ((doc = res.fetchOne()) != null) {
System.out.println(doc);
}
C++ 代码
Collection myColl = db.getCollection("my_collection");
DocResult res = myColl.find("name like :name").bind("name", "L%").execute();
DbDoc doc;
while ((doc = res.fetchOne()))
{
cout << doc <<endl;
}
Node.js JavaScript 代码
var myColl = db.getCollection('my_collection');
myColl.find('name like :name')
.bind('name', 'L%')
.execute()
.then(res => {
while (doc = res.fetchOne()) {
console.log(doc);
}
});
myColl.find('name like :name')
.bind('name', 'L%')
.execute(function (doc) {
console.log(doc);
});
使用 Node.js 时,结果也可以异步返回给传递给 execute()
的回调函数,并在从服务器到达结果时进行处理。
var myColl = db.getCollection('my_collection');
myColl.find('name like :name')
.bind('name', 'L%')
.execute(function (doc) {
console.log(doc);
});
以下示例展示了如何直接访问 Table.select()
操作返回的行。结果迭代的基本代码模式相同。以下示例与上一个示例的区别在于数据项处理。这里,fetchOne()
返回行。访问行的列值的具体语法取决于语言。实现旨在提供语言本地的访问模式。此示例假定 test
模式存在,并且 myTable
中存在 employee 表。
MySQL Shell JavaScript 代码
var myRows = myTable.select(['name', 'age']).
where('name like :name').bind('name','L%').
execute();
var row;
while (row = myRows.fetchOne()) {
// Accessing the fields by array
print('Name: ' + row['name'] + '\n');
// Accessing the fields by dynamic attribute
print(' Age: ' + row.age + '\n');
}
MySQL Shell Python 代码
myRows = myTable.select(['name', 'age']).where('name like :name').bind('name','L%').execute()
row = myRows.fetch_one()
while row:
# Accessing the fields by array
print('Name: %s\n' % row[0])
# Accessing the fields by dynamic attribute
print('Age: %s\n' % row.age)
row = myRows.fetch_one()
Node.js JavaScript 代码
var myRows = myTable
.select(['name', 'age'])
.where('name like :name')
.bind('name','L%')
.execute(function (row) {
// Connector/Node.js does not support referring to row columns by their name yet.
// One needs to access fields by their array index.
console.log('Name: ' + row[0]);
console.log(' Age: ' + row[1]);
});
或者,您可以使用回调
myTable.select(['name', 'age'])
.where('name like :name')
.bind('name', 'L%')
.execute()
.then(myRows => {
while (var row = myRows.fetchOne()) {
// Accessing the fields by array
console.log('Name: ' + row[0] + '\n');
console.log('Age: ' + row[1] + '\n');
}
});
C# 代码
var myRows = myTable.Select("name", "age")
.Where("name like :name").Bind("name", "L%")
.Execute();
Row row;
while ((row = myRows.FetchOne()) != null)
{
// Accessing the fields by array
Console.WriteLine("Name: " + row[0]);
// Accessing the fields by name
Console.WriteLine("Age: " + row["age"]);
}
Python 代码
rows = my_table.select(['name', 'age']).where('name like :name').bind('name','L%').execute()
row = rows.fetch_one()
while row:
# Accessing the fields by array
print('Name: {0}'.format(row[0]))
# Accessing the fields by dynamic attribute
print('Age: {0}'.format(row['age'])
row = rows.fetch_one()
Java 代码
RowResult myRows = myTable.select("name, age")
.where("name like :name").bind("name", "L%")
.execute();
Row row;
while ((row = myRows.fetchOne()) != null) {
// Accessing the fields
System.out.println(" Age: " + row.getInt("age") + "\n");
}
C++ 代码
RowResult myRows = myTable.select("name", "age")
.where("name like :name")
.bind("name", "L%")
.execute();
Row row;
while ((row = myRows.fetchOne()))
{
// Connector/C++ does not support referring to row columns by their name yet.
cout <<"Name: " << row[0] <<endl;
cout <<" Age: " << row[1] <<endl;
int age = row[1];
// One needs explicit .get<int>() as otherwise operator<() is ambiguous
bool uforty = row[age].get<int>() < 40;
// Alternative formulation
bool uforty = (int)row[age] < 40;
}