Bài 6-Kỹ thuật Truy vấn với dữ liệu lớn trong MongoDB

Trong bài 5 các bạn đã biết cách dùng C# để kết nối và truy vấn dữ liệu từ MongoDB rồi. Tuy nhiên MongoDB là một trong những loại hệ quản trị nằm trong hệ sinh thái Big Data. Do đó thường dữ liệu trong MongoDB là rất lớn, vì vậy việc truy suất dữ liệu cũng phải có sự thay đổi cho phù hợp để tránh chương trình bị treo do mất thời gian truy suất.

Ta xem lại cách coding ở bài 5 về việc truy suất lấy dữ liệu trong bảng Product:

[code language=”csharp”]

private void btnGetProduct_Click(object sender, RoutedEventArgs e)
{

MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);

IMongoCollection collection = database.GetCollection(“Product”);
List documents = collection.Find(new BsonDocument()).ToList();
lstProduct.Items.Clear();
foreach (BsonDocument document in documents)
{
string ma = document[“Ma”].AsString;
string ten = document[“Ten”].AsString;
double gia = document[“DonGia”].AsDouble;
lstProduct.Items.Add(ma + “\t” + ten + “\t” + gia);
}

}

[/code]

Với cách viết ở trên, chương trình sẽ bị treo (thời gian chờ rất lâu) khi dữ liệu trong Product là lớn.

Theo đề nghị của MongoDB và các diễn đàn thì ta dùng kỹ thuật như sau để truy suất trong trường hợp Product có nhiều dữ liệu:

[code language=”csharp”]

private async void btnGetProduct_Click(object sender, RoutedEventArgs e)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);

IMongoCollection collection = database.GetCollection(“Product”);
List documents = collection.Find(new BsonDocument()).ToList();
lstProduct.Items.Clear();
await collection.Find(new BsonDocument()).ForEachAsync(document =>
{
string ma = document[“Ma”].AsString;
string ten = document[“Ten”].AsString;
double gia = document[“DonGia”].AsDouble;
Dispatcher.BeginInvoke(
new ThreadStart(() => lstProduct.Items.Add(ma + “\t” + ten + “\t” + gia)));
}
);
}

[/code]

Cách viết trên sử dụng các kiến thức về LINQ (như là Lambda Expression, anomous method…).

Các kỹ thuật xử lý đa tiến trình, async , await…

-MainWindow.xaml đầy đủ:

[code language=”xml”]

[/code]

Code MainWindow.xaml.cs đầy đủ:

[code language=”csharp”]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using MongoDB.Bson;
using MongoDB.Driver;

namespace CSharpMongoDBExample
{
///

/// Interaction logic for MainWindow.xaml
///

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

private async void btnGetProduct_Click(object sender, RoutedEventArgs e)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);

IMongoCollection collection = database.GetCollection(“Product”);
List documents = collection.Find(new BsonDocument()).ToList();
lstProduct.Items.Clear();
await collection.Find(new BsonDocument()).ForEachAsync(document =>
{
string ma = document[“Ma”].AsString;
string ten = document[“Ten”].AsString;
double gia = document[“DonGia”].AsDouble;
Dispatcher.BeginInvoke(
new ThreadStart(() => lstProduct.Items.Add(ma + “\t” + ten + “\t” + gia)));
}
);
}
}
}

[/code]

==>Source code ví dụ mẫu này tải ở đây- Anomous Example

Ngoài ra, nếu việc tương tác dữ liệu sau khi truy suất mà phức tạp thì ta có thể sửa hàm lấy dữ liệu từ Anomous Method qua tường minh(explicit) như sau (Nếu không rành về LINQ thì nghiên cứu ở đây):

==>Sourcecode ví dụ mẫu này tải ở đây- Explicit Example

Bài sau ta sẽ nghiên cứu cách thức Filter dữ liệu từ MongoDB về client

Các khóa học online khác, bạn có thể tham khảo tại đây:

https://unica.vn/?aff=11929

Chúc các bạn thành công!

2 thoughts on “Bài 6-Kỹ thuật Truy vấn với dữ liệu lớn trong MongoDB”

Leave a Reply