Bài 7 – Các Kỹ thuật filter dữ liệu trong MongoDB với C#


Ở bài 6 chúng ta được biết cách dùng C# để truy vấn dữ liệu rồi, trong thực tế chúng ta phải đối mặt với các bài toán như: Tìm kiếm (filter), sắp xếp (sort)… Có thể nói mọi người chúng ta đều thực hiện 2 thao tác Tìm Kiếm và Sắp xếp trong suốt các hoạt động thường nhật, Ai sắp xếp tốt thì tìm kiếm nhanh, đáp ứng công việc hiệu quả hơn. Do đó trong mọi phần mềm ta đều phải cung cấp các chức năng Tìm kiếm và sắp xếp.

Trước tiên ta nhập thêm một số dữ liệu để hỗ trợ cho bài học Filter được phong phú hơn như dưới đây (bấm chọn Table để xem dạng Table cho dễ nha):

Ngoài ra bạn có thể tải dữ liệu JSON của bảng Product ở đây (xuất xuất dữ liệu bạn vào menu View/ Export. Muốn nhập dữ liệu bạn vào menu View/Import): Product.json

Driver .Net cung cấp hàng loạt các cách thức Filter để đáp ứng hầu hết mọi nhu cầu của người dùng.

Đối tượng Builders<BsonDocument>.Filter trong thư viện này cung cấp các hàm phổ biến như sau (còn nhiều hàm khác các bạn tự khám phá nha):

var builder = Builders<BsonDocument>.Filter;

 

Tên hàm
Ý nghĩa
builder.Eq(attribute,value) Lọc ra các phần tử mà attribute của nó có giá trị là value
builder.Gt(attribute,value) Lọc ra các phần tử mà attribute của nó có giá trị  lớn hơn value
builder.Gte(attribute,value) Lọc ra các phần tử mà attribute của nó có giá trị lớn hơn hoặc bằng value
builder.Lt(attribute,value) Lọc ra các phần tử mà attribute của nó có giá trị nhỏ hơn value
builder.Lte(attribute,value) Lọc ra các phần tử mà attribute của nó có giá trị nhỏ hơn hoặc bằng value
builder.Where (LINQ Expression)
Lọc kết hợp nhiều điều kiện

Chi tiết cách sử dụng:

-1.Hàm Eq: builder.Eq(attribute,value)

Ví dụ 1:

Hãy viết lệnh lấy tất cả các Product mà DonGia = 150


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Eq("DonGia", 150);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả:

Ví dụ 2:

Hãy viết lệnh hiển thị thông tin chi tiết của 1 Product có mã =P1


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Eq("Ma", "P1");

BsonDocument document = collection.Find(query).FirstOrDefault();
if(document!=null)
{
string ma = document["Ma"].AsString;
string ten = document["Ten"].AsString;
double gia = document["DonGia"].AsDouble;
MessageBox.Show(ma + "-" + ten + "-" + gia);
}
else
{
MessageBox.Show("Ko thấy P1");
}
}

Kết quả:

-2 hàm Gt: builder.Gt(attribute,value)

Ví dụ 3:

Viết lệnh hiển thị tất cả các Product có Đơn giá lớn hơn 230


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Gt("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả (để ý không có sản phẩm có giá 230 hiển thị ở đây):

-3 hàm Ge: builder.Gte(attribute,value)

Ví dụ 4:

Viết lệnh hiển thị tất cả các Product có Đơn giá lớn hơn hay bằng 230


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Gte("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả (để y có sản phẩm có giá 230 hiển thị ở đây):

-4 Hàm Lt: builder.Lt(attribute,value)

Ví dụ 5:

Viết lệnh hiển thị tất cả các Product có Đơn giá nhỏ hơn 230


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Lt("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả (Để ý không có Sản phẩm nào có giá 230 hiển thị ở đây):

-5 Hàm Lte: builder.Lte(attribute,value)

Ví dụ 6:

Viết lệnh hiển thị tất cả các Product có Đơn giá nhỏ hơn hay bằng 230


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Lte("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả (Để ý có sản phẩm có giá 230 hiển thị ở đây):

-6- Kết hợp Lt/Lte với Gt/Gte

Ví dụ 7:

Hãy kết hợp Lte và Gte (hoặc Lt với Gt) để lọc ra các Sản phẩm có giá từ 155 đến 250


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
//lệnh kết hợp các hàm Filter dữ liệu:
var query = builder.Gte("DonGia", 155) & builder.Lte("DonGia", 250);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả:

-7- Hàm Where: builder.where(LINQ Expression)

Ví dụ 8:

Dùng hàm Where để lọc ra các Sản phẩm có giá từ 155 đến 250 (ở ví dụ 7 ta đã làm bài này bằng cách kết hợp Lte và Gte)


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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Where(x => x["DonGia"] >= 155 && x["DonGia"] <= 250);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

Kết quả:

Tổng hợp 8 Ví dụ trên ta có giao diện như dưới đây:

Mã giao diện MainWindow.xaml:


Mã nguồn toàn bộ chương trình (MainWindow.xaml.cs):


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 void btnEQ_Gia_Click(object sender, RoutedEventArgs e)
{
MongoClient client = new MongoClient("mongodb://localhost:27017");
IMongoDatabase database = client.GetDatabase("QuanLySanPham");

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Eq("DonGia", 150);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Eq("Ma", "P1");

BsonDocument document = collection.Find(query).FirstOrDefault();
if(document!=null)
{
string ma = document["Ma"].AsString;
string ten = document["Ten"].AsString;
double gia = document["DonGia"].AsDouble;
MessageBox.Show(ma + "-" + ten + "-" + gia);
}
else
{
MessageBox.Show("Ko thấy P1");
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Gt("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Gte("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Lt("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Lte("DonGia", 230);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
//lệnh kết hợp các hàm Filter dữ liệu:
var query = builder.Gte("DonGia", 155) & builder.Lte("DonGia", 250);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

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

IMongoCollection collection =
database.GetCollection("Product");

var builder = Builders.Filter;
var query = builder.Where(x => x["DonGia"] >= 155 && x["DonGia"] <= 250);
List documents = collection.Find(query).ToList();
//là tên của 1 Listbox nào đó
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);
}
}

}
}

==>Sourcecode các ví dụ mẫu này tải ở đây

Bài sau ta sẽ nghiên cứu cách thức Binding dữ liệu MongoDB lên ListView trong C# WPF để hiện thị dữ liệu dạng lưới các thông tin của Product để dễ quan sát cũng như hỗ trợ cho các bài toán về Sắp xếp dữ liệu.

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!

3 responses

  1. […] bài 7 chúng ta đã thao tác tốt với các kỹ thật Filter rồi, bài này Tui hướng dẫn […]

  2. […] 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 […]

  3. […] Bài 7 – Các Kỹ thuật filter dữ liệu trong MongoDB với C# […]

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: