X DevAPI 用户指南  / 第 9 章 使用结果集  /  9.3 使用数据集

9.3 使用数据集

获取数据项的操作返回数据集,而不是修改数据并返回结果集的操作。可以使用 Collection.find(), Table.select()和 来从数据库中读取数据项Session.sql()。这三种方法都返回封装数据项的数据集。 Collection.find()返回一个包含文档的数据集,并Table.select()分别 Session.sql()返回一个包含行的数据集。

所有数据集都采用统一的方式迭代其数据项。统一语法支持使用 逐一获取项目 fetchOne()或使用 检索所有项目的列表fetchAll()fetchOne()fetchAll()遵循只进迭代语义。实现 X DevAPI 的连接器可以在顶部提供更高级的迭代模式以匹配常见的本地语言模式。

以下示例显示如何Collection.find()通过使用 fetchOne()循环遍历所有文档来访问操作返回的文档。

第一次调用fetchOne()返回找到的第一个文档。所有后续调用都会将内部数据项迭代器游标递增一个位置,并返回找到的项目进行第二次调用以fetchOne()返回找到的第二个文档(如果有)。当最后一个数据项被读取并fetchOne()再次调用时,返回 NULL 值。这确保了所示的基本 while 循环适用于所有实现 X DevAPI 的语言(如果语言支持此类实现)。

使用fetchOne()时,无法将内部数据项光标重置为第一个数据项以再次开始读取数据项。fetchOne() 连接器可以丢弃一次使用过的数据项(此处为文档) 。数据项的生命周期与数据集分离。从连接器的角度来看,项目在获取时由调用者使用。此示例假定测试模式存在。

MySQL 外壳 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 外壳 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.

MySQL 外壳 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 外壳 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;
}