9.3 使用資料集

擷取資料項目的操作會傳回一個游標,可用於從結果集中取用這些資料項目。可以使用 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() 擷取一次的資料項目 (此處為 Document) 可由連接器捨棄。資料項目的存留期與資料集脫鉤。從連接器的角度來看,項目會在擷取時由呼叫者取用。此範例假設測試綱要存在。

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);
}

以下範例示範如何直接存取 Table.select() 操作傳回的列。結果迭代的基本程式碼模式相同。以下範例與上一個範例的差異在於資料項目處理。在此,fetchOne() 會傳回 Rows。存取 Row 的欄位值的確切語法與語言相關。實作會嘗試提供語言原生的存取模式。此範例假設 test 綱要存在,且 myTable 中存在 employee 資料表。

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');
}