Hướng dẫn filter mongodb query

Ở 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):

Hướng dẫn filter mongodb query
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ả:

Hướng dẫn filter mongodb query
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ả:

Hướng dẫn filter mongodb query
-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):

Hướng dẫn filter mongodb query
-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):

Hướng dẫn filter mongodb query
-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):

Hướng dẫn filter mongodb query
-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):

Hướng dẫn filter mongodb query
-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ả:

Hướng dẫn filter mongodb query
-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ả:

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

Hướng dẫn filter mongodb query
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!