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:


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

}

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:


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

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 MainWindow.xaml.cs đầy đủ:


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

==>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: http://communityuni.com/

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

2 responses

  1. […] vấn dữ liệu(các lệnh truy vấn bạn đã được học rất kỹ ở những bài 5, 6, 7, 8 […]

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

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: