Bài 15- Thêm mới dữ liệu vào MongoDB trong Android Kotlin

bài 14 các bạn đã biết cách kết nối và truy suất dữ liệu, và đặc biết có lưu ý về việc đổi địa chỉ IP trong cấu hình của mongod.cfg. Trong bài này Tui cố tình chuyển quán Cafe khác để viết hướng dẫn nhằm mục đích thay đổi địa chỉ IP của Laptop để cố tình làm cho MongoDB Service nó chạy sai om sòm để các bạn nhớ lại rằng cứ mỗi lần bị đổi IP thì phải sửa lại mongod.cfg và chạy lại service (Lưu ý khi ta đã có Server riêng và có public IP thì hầu như chả bao giờ phải sửa lại, bạn có thể bỏ ra 1 ít tiền để mua VPS sài thử cho nó có cảm giác nha).

bài 14 thì IP Laptop của Tui do quán cafe phân giải là: 172.16.96.173 còn trong bài 15 này thì IP là: 192.168.1.137 . Dó đó khi mở lại Project trong bài 14 để tiếp tục làm chức năng thêm mới dữ liệu Tui phải sửa lại IP kết nối là 192.168.1.137 và dĩ nhiên trước đó phải chạy lại Service đã được lưu ý trong bài 14 (Còn bạn thì bạn tự kiểm tra lại máy mình nha, lấy IP theo đúng máy của bạn).

Sau khi kết thúc bài học này bạn phải thêm được dữ liệu vào MongoDB, giao diện như sau:

Để lưu dữ liệu vào MongoDB ta dùng các lệnh sau:

[code language=”java”]
var connectionString = MongoClientURI(“mongodb://192.168.1.137:27017”)
var mongoClient = MongoClient(connectionString)

var database = mongoClient.getDatabase(“QuanLySanPham”)
var collection = database.getCollection(“Product”)
var doc = Document(“Ma”, “P999”)
.append(“Ten”, “Thuốc trị hôi nách”)
.append(“DonGia”, 35)
collection.insertOne(doc)
[/code]

Ta sẽ tạo một Document và đưa giá trị cũng như các thuộc tính vào sao cho khớp với bảng trong MongoDB.

Lệnh insertOne để lưu document vào MongoDB.

Chi tiết các bước ta làm như sau:

Thiết kết màn hình Thêm Product. Cách thêm một màn hình mới Tui đã chỉ rất chi tiết trong bài 14 rồi, các bạn tự xem lại nha.

Màn hình Thêm Product đặt tên là: ThemProductActivity. Tui chụp cấu trúc để dễ tưởng tượng:

Lưu ý là mở lại Project cũ, bài này chỉ thêm “ThemProductActivity” thôi nha các tình yêu.

Giao diện XML như sau:

[code language=”xml”]
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
android:orientation=”vertical”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
tools:context=”.ThemProductActivity”>

<TextView
android:id=”@+id/textView2″
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”Mã Product:”
android:textSize=”20sp” />

<EditText
android:id=”@+id/edtMa”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:ems=”10″
android:inputType=”textPersonName” />

<TextView
android:id=”@+id/textView”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”Tên Product:”
android:textSize=”20sp” />

<EditText
android:id=”@+id/edtTen”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:ems=”10″
android:inputType=”textPersonName” />
<TextView
android:id=”@+id/textView3″
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”Đơn giá:”
android:textSize=”20sp” />

<EditText
android:id=”@+id/edtDonGia”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:ems=”10″
android:inputType=”numberDecimal” />

<Button
android:onClick=”xuLyThemProduct”
android:id=”@+id/btnLuu”
android:layout_width=”match_parent”
android:layout_height=”wrap_content”
android:text=”Lưu”
android:textSize=”20sp” />
</LinearLayout>
[/code]

Giao diện khi chạy lên sẽ như sau:

Tiếp tục ta bổ sung coding cho ThemProductActivity:

[code language=”java”]
package com.communityuni.androidkotlintomongodb

import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.EditText
import android.widget.Toast
import com.communityuni.model.Product
import com.mongodb.MongoClient
import com.mongodb.client.MongoCollection
import com.mongodb.client.MongoDatabase
import com.mongodb.MongoClientURI
import org.bson.Document

class ThemProductActivity : AppCompatActivity() {
lateinit var edtMa:EditText
lateinit var edtTen:EditText
lateinit var edtDonGia:EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_them_product)

addControls()
}

private fun addControls() {
edtMa=findViewById(R.id.edtMa)
edtTen=findViewById(R.id.edtTen)
edtDonGia=findViewById(R.id.edtDonGia)
}
fun xuLyThemProduct(view:View)
{
var ma=edtMa.text.toString()
var ten=edtTen.text.toString()
var gia=edtDonGia.text.toString()
var p=Product(ma,ten,gia.toDouble())

ThemProductTask().execute(p)
}
inner class ThemProductTask : AsyncTask<Product, Void, Boolean>()
{
override fun onPreExecute() {
super.onPreExecute()
}
override fun doInBackground(vararg p0: Product?): Boolean {
var p:Product?=p0[0]
try {
var connectionString = MongoClientURI(“mongodb://192.168.1.137:27017”)
var mongoClient = MongoClient(connectionString)

var database = mongoClient.getDatabase(“QuanLySanPham”)
var collection = database.getCollection(“Product”)
var doc = Document(“Ma”, p?.Ma)
.append(“Ten”, p?.Ten)
.append(“DonGia”, p?.DonGia)
collection.insertOne(doc)
return true
} catch (ex: Exception) {
Log.e(“LOI”, ex.toString())
}
return false
}
override fun onPostExecute(result: Boolean?) {
super.onPostExecute(result)
if(result==true)
{
Toast.makeText(applicationContext,”Thêm thành công”,Toast.LENGTH_LONG).show();
finish()
}
else
{
Toast.makeText(applicationContext,”Thêm thất bại”,Toast.LENGTH_LONG).show();
}
}
}
}
[/code]

Cũng như bài 14, ta phải dùng đa tiến trình để xử lý. Các kiến thức và Kotlin Tui đã trình bày chi tiết trong link này với đầy đủ kiến thức và Ebook, hoặc các bạn có thể đăng ký học Kotlin qua Video tại đây.

Bây giờ trong MainActivity ta gọi lệnh mở màn hình ThemProductActivity:

[code language=”java”]
fun ThemProduct(view:View)
{
var intent= Intent(this,ThemProductActivity::class.java)
startActivity(intent)
}
[/code]

Chạy lên ta sẽ được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code thêm mới dữ liệu MongoDB trong Android Kotlin.

Và các Em chú ý là Project này sẽ được dùng cho bài sau nữa nha, nên bắt buộc phải hiểu và làm được bài này cho tốt.

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật tương tác dữ liệu (sửa, xóa) trực tiếp từ Android Kotlin tới MongoDB, các bạn chú ý theo dõi.

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!

Bài 14-Cách kết nối và truy suất dữ liệu MongoDB trong Android Kotlin

bài 13 các bạn đã biết cách tham chiếu thư viện cho MongoDB trong Android rồi, Bài này Tui sẽ hướng dẫn các bạn cách thức kết nối từ Android Kotlin tới MongoDB cũng như cách truy suất dữ liệu một cách trực tiếp như thế nào! Đặc biệt Tui sẽ dùng Android Studio mới nhất, SDK mới nhất, Kotlin mới nhất, MongoDB mới nhất tính tới thời điểm 12/06/2018

Kết thúc bài này bạn phải làm được giao diện như kết quả dưới đây:

Màn hình chính các các nút: Xem Product, Thêm Product, sửa Product, Xóa Product và Thoát phần mềm. Trong bài này Ta chỉ viết một chức năng đó là Xem Product. Khi bấm vào nút Xem Product thì hiển thị màn hình bên phải là Danh Sách Product được truy suất từ MongoDB. Chú ý Project đã được tạo Ở bài 13 nên các bạn mở lại nó nha

Bây giờ ta tiến hành làm chi tiết từng chức năng, thứ nhất là thiết kết màn hình chính gồm 5 Button như trên (Là màn hình MainActivity), ta mở XML layout lên để thiết kết, xem coding XML của MainActivity:

[code language=”XML”]

[/code]

Ta có thể kéo thả trực tiếp vào mục Component Tree trong phần Design:

Chú ý đặt tên Control(View) như Tui đã làm ở trên.

Tiếp tục, để tạo màn hình Xem danh Sách Product truy suất từ MongoDB ta làm như sau (Bấm chuột phải vào package/ chọn New/ chọn Activity/ Chọn Empty Activity như hình dưới):

Lúc này Nó xuất hiện một cửa sổ Configure Acitvity:

Ta đổi  Activity name thành XemProductActivity:

Cấu hình mọi thứ như trên rồi bấm Finish để tạo Activity Xem danh sách Sản phẩm, quan sát sẽ thấy XemProductActivity như trong hình:

Vì màn hình này chỉ dùng để hiện thị danh sách Sản phẩm nên ta chỉ cần đưa 1 ListView hoặc View gì cũng được miễn là nó hiển thị được danh sách (như RecyclerView chẳng hạn)..

XML của màn hình XemProduct:

[code language=”xml”]

[/code]

Xem phần Design:

Ta sẽ viết thêm 1 lớp model Product để mô hình hóa dữ liệu từ MongoDB về Kotlin class (tương tự như C# mà ta đã được học)

Ta bấm chuột phải vào java package / Chọn New / Chọn Package như hình dưới:

Lúc này màn hình tạo Package hiển thị ra:

Ta đặt: com.communityuni.model (dĩ nhiên tên gì kệ xác bạn, thường để trong model để nó đồng cấp với các package khác). Đây là cách mà bạn bố trí cho nó phù hợp. Lúc tạo Project chỗ company domain thế nào thì ở đây nhất quán như vậy

OK, nhấn OK nha you, kết quả:

Vậy  rõ ràng bạn thấy model nó đồng cấp với bên trên rồi, nó phân loại các lớp như vậy để ta dễ xử lý thôi, bây giờ tạo 1 lớp tên là Product ở trong model như sau: Bấm chuột phải vào model/ chọn new / chọn Kotlin File/class:

Lúc này màn hình yêu cầu tạo model class được xuất hiện:

Name: Đặt tên là Product

Kind: chọn Class

Bấm OK để tạo

Sau đó bổ sung coding cho Product như sau:

[code language=”java”]
package com.communityuni.model

class Product {
lateinit var _id:Any
lateinit var Ma:String
lateinit var Ten:String
var DonGia:Double=0.0
constructor(ma:String,ten:String,donGia:Double)
{
Ma=ma
Ten=ten
DonGia=donGia
}
override fun toString(): String {
return Ma+”\n”+Ten+”\n”+DonGia+”VNĐ”
}
}
[/code]

Lưu ý, chi tiết cách lập trình hướng đối tượng trong Kotlin có thể xem ở đây (xem bài 22, 23, 24, 25, 26, 27, 28) hoặc các bạn có thể đăng ký học Kotlin qua Video tại đây.

OK, bây giờ ta quay lại lớp: MainActivity.kt để lập trình, coding:

[code language=”java”]
package com.communityuni.androidkotlintomongodb

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
fun xemProduct(view: View)
{
var intent= Intent(this,XemProductActivity::class.java)
startActivity(intent)
}
}
[/code]

Coding ở trên dùng để mở màn hình XemProductActivity. Đây là cách xử lý sự kiện loại onclick XML, các bạn có thể xem lại 6 loại xử lý sự kiện trong Android ở đây và tự chuyển qua kotlin một cách dễ dàng.

Bây giờ ta mở coding của lớp XemProductActivity.kt:

Trong màn hình này có 2 tác vụ chính: Thứ nhất là làm thế nào để kết nối từ Android lên MongoDB, Thứ 2 là làm thể nào để truy suất dữ liệu trong bảng Product để hiển thị lên giao diện ListView.

Để Kết nối tới Server (Cluster) MongoDB ta làm như sau:

[code language=”java”]
var connectionString = MongoClientURI(“mongodb://172.16.96.173:27017”)
var mongoClient = MongoClient(connectionString)
[/code]

Các bạn lưu ý ở trên phải dùng địa chỉ IP nha, không có dùng localhost được vì từ Mobile nó sẽ tìm ra Server nào có IP tương ứng (nếu để localhost nó tưởng là kết nối với chính Mobile,  vì Mobile cũng là 1 hệ điều hành nó có localhost, có nghĩa là nếu để localhost là bị hiểu nhầm). Và có 1 lưu ý quan trọng là địa chỉ IP này phải được khai báo và start service trong file mongod.cfg. Bạn tự kiểm tra lúc đó máy tính (laptop) hay server nào đó của bạn đang dùng IP là gì thì phải Start Service lại (bắt buộc nếu không kể cả MongoDB compass với Android mobile cũng không thể nào kết nối được với MongoDB server). Ở bài 2 Tui đã trình bày rất kỹ cách thức cấu hình để start service. Các bạn xem lại bài này để bổ sung(hay thay đổi IP cho nó phù hợp để Start service, nếu IP cung cấp sai hay tự nhiên bị đổi thì cũng không thể nào chạy được). Cơ sở dữ liệu dùng cho bài này cũng được nói ở bài 3.

Giả sử như bạn đã làm rất tốt bài 2 rồi, tuy nhiên lỡ Laptop của mình bị đổi IP hay Server bị đổi (laptop thì thường xuyên rồi, thì lúc này không cỡ nào mà chạy được Service MongoDB), do đó bạn chỉ kiểm tra lại IP máy mình có bị đổi không rồi bổ sung vào mongod.cfg:

đấy, hình ở trên Tui chụp lại nội dung file cấu hình mongod.cfg và nó cũng được cung cấp trong bài 2 . Mục bindIP được cápa thì tất cả IP trong đó bắt buộc phải tồn tại và kết nối được, nếu IP nào tự nhiên mất thì cũng phải xóa nó đi để thay thế IP mới (Ví dụ hôm nay bạn học ở nhà IP là X chạy OK, hôm sau ra quán Cafe bị đổi thành IP khác thì cũng phải mở file này lên sửa lại IP được cấp trong quán Cà phê).

Nếu thực sự bạn bị đổi IP và phải sửa lại thì bắt buộc phải chạy lại 2 lệnh: stop và start dịch vụ của MongoDB server như hình dưới đây:

Như vậy là ngon lành cành đào nha, tình huống nào ta cũng biết cách xử lý (nếu không biết là ăn hành ngay, không hiểu vì sao ở nhà đang chạy ngon lành, qua nhà bồ nhí làm lại không chạy, bể hụi liền).

OK, như vậy ở trên ta đã biết coding kết nối tới Cluster/Server. Sau đó ta lấy nó để kết nối tới tên Cơ sở dữ liệu như mong muốn:

[code language=”java”]
var database = mongoClient.getDatabase(“QuanLySanPham”)
[/code]

Để đọc dữ liệu trong bảng nào đó ta làm như sau (giả sử bảng Product):

[code language=”java”]
val collection = database.getCollection(“Product”)
[/code]

Sau đó để đọc dữ liệu trong bảng Product ta coding như sau:

[code language=”java”]
var cursor = collection.find().iterator()
var dsProduct = ArrayList()
try {
while (cursor.hasNext()) {
val data = cursor.next().toJson()
val jsonObject = JSONObject(data)
val ma = jsonObject.getString(“Ma”)
val ten = jsonObject.getString(“Ten”)
val gia = jsonObject.getDouble(“DonGia”)
var product=Product(ma,ten,gia)
dsProduct.add(product)
}
} finally {
cursor.close()
}
[/code]

Ta lưu ý, với Android cho dù là Java hay Kotlin thì cũng phải viết đa tiến trình khi có kết nối Internet và phải cấp quyền trong AndroidManifest:

[code language=”xml”]

[/code]

Và đây là coding chi tiết cho màn hình Xem Danh sách product (XemProductActivity):

[code language=”java”]
package com.communityuni.androidkotlintomongodb

import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import com.communityuni.model.Product
import com.mongodb.MongoClient
import com.mongodb.MongoClientURI
import org.json.JSONObject

class XemProductActivity : AppCompatActivity() {
lateinit var lvProduct:ListView
lateinit var adapter:ArrayAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_xem_product)
addControls()
viewListProduct()
}

private fun viewListProduct() {
var task= ProductTask()
task.execute()
}
private fun addControls() {
lvProduct=findViewById(R.id.lvProduct)
adapter =ArrayAdapter(this,android.R.layout.simple_list_item_1)
lvProduct.adapter=adapter
}
inner class ProductTask : AsyncTask() {
override fun onPreExecute() {
super.onPreExecute()
adapter.clear()
}
override fun doInBackground(vararg p0: Any?): List {
var connectionString = MongoClientURI(“mongodb://172.16.96.173:27017”)
var mongoClient = MongoClient(connectionString)
var database = mongoClient.getDatabase(“QuanLySanPham”)
val collection = database.getCollection(“Product”)

var cursor = collection.find().iterator()
var dsProduct = ArrayList()
try {
while (cursor.hasNext()) {
val data = cursor.next().toJson()
val jsonObject = JSONObject(data)
val ma = jsonObject.getString(“Ma”)
val ten = jsonObject.getString(“Ten”)
val gia = jsonObject.getDouble(“DonGia”)
var product=Product(ma,ten,gia)
dsProduct.add(product)
}
} finally {
cursor.close()
}
return dsProduct
}
override fun onPostExecute(result: List?) {
super.onPostExecute(result)
adapter.addAll(result)
}
}
}
[/code]

Như vậy Tui đã hoàn tất bài hướng dẫn chi tiết về cách kết nối và truy vấn dữ liệu trong MongoDB.Chạy chương trình lên ta có được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code kết nối và truy suất dữ liệu MongoDB trong Android Kotlin.

Và các Em chú ý là Project này sẽ được dùng cho bài sau nữa nha, nên bắt buộc phải hiểu và làm được bài này cho tốt.

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật tương tác dữ liệu (thêm, sửa, xóa) trực tiếp từ Android Kotlin tới MongoDB, các bạn chú ý theo dõi.

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!

Bài 13- Cách tải và tham chiếu driver MongoDB cho Android Kotlin

Như vậy chúng ta đã hoàn thành xong 12 bài học về tương tác C# WPF với MongoDB. Tiếp theo Tui sẽ cung cấp cho các bạn chuỗi các bài học về Android Kotlin với MongoDB, sau đó là tới NodeJS.

Các bạn cần biết thêm ý niệm này: Có những trường hợp Công ty muốn kết nối trực tiếp từ Mobile tới MongoDB, Có những trường hợp Công ty muốn kết nối từ Mobile tới MongDB nhưng phải thông qua các API (thường là Web Restful API). Và bản thân chúng ta là Programmer thì cho dù trường hợp này cũng phải xử lý được. Chuỗi các bài học này Tui sẽ hướng dẫn cách thức Mobile tương tác trực tiếp tới MongDB, sau đó sẽ qua RestFul viết bằng NodeJS.

Các bạn nghe có vẻ thú vị chứ? vậy hãy tập nghiên cứu từng trường hợp nha, mỗi trường hợp nó có những điểm được và chưa được tùy từng trường hợp mà ta áp dụng.

Bài học đầu tiên trong chuỗi này, Tui sẽ hướng dẫn cách thức tải Driver và tham chiếu nó vào Android Kotlin Project như thế nào.

Bước 1: Tải Driver MongoDB cho Android

Vào link https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/ chọn phiên bản nào cũng được, Nhưng theo Tui thì Programmer nên có thêm tính phiêu lưu là chọn bản mới nhất kể cả Beta:

Bạn ngó thấy đó, tại thời điểm Tui viết hướng dẫn (12/06/2018) thì đang có bản beta là 3.8.0, có thể lúc bạn đang đọc hướng dẫn này thì nó có version nào rồi (chả quan tâm)

Vậy ở trên Tui thử chọn 3.7.1 nha, bấm vào nó, ta có:

OK, vậy Ta bấm vào mongo-java-driver-3.7.1.jar để tải về nha

Tải thành công thì dung lượng gần 2MB như ở trên. Bước 2 là ta đưa nó vào Project Android nha.

Bước 2: Ta tạo 1 Project Android Kotlin tên là AndroidKotlinToMongoDB. Khởi động Android Studio lên, tại thời điểm Tui viết hướng dẫn này thì Android Studio là version mới nhất 3.1.3 (cập nhật ngày 12/06/2018):

Ở màn hình trên, ta bấm vào Start new Android Studio Project (lưu ý các chuỗi bài học về Android Java rất đầy đủ và chi tiết Tui có trình bày ở đây https://duythanhcse.wordpress.com/lap-trinh-di-dong/android/ các bạn nào chưa học thì vào học nha).

Mục Application name, bạn đặt: AndroidKotlinToMongoDB

Mục Company Domain, bạn đặt: communityuni.com

Mục Project Location, bạn thích lưu ở đâu thì kệ bạn (ổ D là OK nhất nha các Thím)

Và cuối cùng là lưu ý quan trọng: Checked vào mục Include Kotlin support

OK Thím, bấm Next nha, còn rảnh thì bấm Cancel và làm lại

Ở màn hình này ta checked vào Phone & Tablet, API thì tùy bạn cài đặt, nói chung chọn mặc định cho lẹ, không cần tỏ vẻ huy hiểm chỗ này. Những mục ở dưới đừng có checked nha (Wear – cho đồng hồ thông minh, TV – cho TiVi thông minh, Android Auto-Cho xe hơi, Android things- cho IOTs). Bấm Next để tiếp tục:

ở đây có rất nhiều Activity (màn hình) mặc định, tốt nhất chọn Empty Activity như trên hình Tui chụp nha. Khi nào rành rồi thì chọn cái gì mặc xác bạn, miễn sao đáp ứng được nhu cầu của mình.

Rồi bấm Next nha.

Ở màn hình trên để mặc định, rồi cuối cùng bấm finish để hoàn tất quá trình tạo Android Kotlin Project.

Bấm Finish xong thì tùy vào Nội công máy tính của bạn, chờ nó chạy hơi lâu nha Kết quả:

Bước 3: Tham chiếu  mongo-java-driver-3.7.1.jar vào Android Kotlin Project

Trong mục hiển thị cấu trúc của dự án Android, Ta bấm vào nó theo hình mũi tên, rồi chọn Project, kết quả:

Rồi mở nhóm app ra/ thấy libs ở trên không các Thím? ==>Chép cái thư viện tải về được ở bước 1 đó dán vào đây nha.

Bấm OK xong ta thấy:

sau đó đưa nó trở thành thư viện như sau: Bấm chuột phải vào nó, chọn Ad as Library….

Rồi chọn OK khi có cửa sổ dưới đây hiện ra:

Sau khi bấm OK cũng đợi xíu cho Android Studio compile xong nha.

OK, bây giờ Ta quay lại cấu trúc Android (ở trên là Project).

Bạn có thể vào file build.gradle để thấy thư viện  mongo-java-driver-3.7.1.jar được thêm vào Android Kotlin Project

Project này các Em lưu ý là nó còn được tái sử dụng cho các bài hướng dẫn tiếp theo để ta có một Project hoàn chỉnh xuyên suốt từ A->Z. Do đó các Em lưu lý theo dõi theo số thứ tự bài học để hiểu bài kỹ và tốt hơn.

Như vậy Tới đây các bạn đã hoàn thành xong bước tải và tham chiếu thư viện MongoDB cho Android

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật dùng Android – Kotlin để truy vấn dữ liệu MongoDB, các bạn chú ý theo dõi.

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!

Bài 12-Xóa dữ liệu MongoDB trong C#-WPF

Như vậy CRUD ta đã làm được C, R, U , bài này sẽ kết thúc CRUD với D(Delete), bài sau ta sẽ dùng Android Kotlin để tương tác với MongoDB.

Kết thúc bài này ta phải làm được chương trình như dưới đây:

Ở chương trình trên muốn xóa Product ta có 2 cách: Bấm vào nút Xóa hoặc Bấm chuột phải vào từng Product để xóa.

Về trải nghiệm người dùng thì thông thường họ sẽ muốn Xóa 1 Product hoặc xóa nhiều Product cùng lúc, dưới đây là coding xóa 1 Product:

[code language=”csharp”]

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

var filter = Builders.Filter.Eq(“Ma”, “P3”);
var result=collection.DeleteOne(filter);
if (result.DeletedCount > 0)
MessageBox.Show(“xóa thành công”);
else
MessageBox.Show(“xóa thất bại”);

[/code]

Coding ở trên sẽ xóa 1 ProductP3. DeletedCount sẽ trả về số Record được xóa thành công trong MongoDB. DO đó thông thường ta so sánh nó với 0 để biết xóa thành công hay thất bại

Để xóa nhiều ta làm như sau:

[code language=”csharp”]

MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var builder = Builders.Filter;
List dsXoa = new List();
dsXoa.Add(builder.Eq(“Ma”, “P2”));
dsXoa.Add(builder.Eq(“Ma”, “P5”));
var query = builder.Or(dsXoa);
var result = collection.DeleteMany(query);
if (result.DeletedCount > 0)
MessageBox.Show(“xóa thành công”);
else
MessageBox.Show(“xóa thất bại”);

[/code]

Đoạn code ở trên dùng để xóa 2 Product lần lượt có mã là P2 P5. Hàm DeleteMany giúp ta xóa nhiều Đối tượng trong Mongo, tương tự như phần xóa 1 đối tượng thì nó cũng trả về một kết quả cho ta biết được có bao nhiêu đối tượng được xóa thành công (DeletedCount).

Các bạn lưu ý cái list dsXoa(tên đặt sao cũng được), bản chất của nó là định nghĩa tập các điều kiện lọc Product theo tiêu chí mà bạn muốn (để tạo đầu vào cho câu Query thôi. Do đó bạn có thể kết hợp một cách rất linh động, chẳng hạn như: Lọc Sản phẩm có đơn giá trong vùng nào đó, hay kết hợp vừa đơn giá vừa có nhà sản xuất, ngày nhập hàng… tùy vào cấu trúc cơ sở dữ liệu của bạn.

Trong bài này Tui chỉ hướng dẫn xóa 1 Product, Tui có 1 Bài tập nho nhỏ cho các bạn là hãy viết lệnh xóa nhiều Product bằng cách mỗi dòng hiển thị bổ sung thêm một Checkbox đằng trước, những Product nào được checked thì sẽ được xóa.

Ta tiến hành viết chức năng xóa 1 Product nhé (vẫn dùng Project CRUD_MongoCSharp ở các bài học trước, bài này ta chỉ bổ sung phần xóa để tránh mất thời gian), đầu tiên thiết kế XAML để có ContextMenu (các phần khác đã làm ở những bài trước), chỉnh MainWindow.xaml thành như dưới đây:

[code language=”xml”]

[/code]

Coding Xử lý cho phần xóa (MainWindow.xaml.cs):

[code language=”csharp”]

void XuLyXoa()
{
if (lvProduct.SelectedIndex == -1)
return;

Product p = lvProduct.SelectedItem as Product;

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

var filter = Builders.Filter.Eq(“Ma”, p.Ma);
var result = collection.DeleteOne(filter);
if (result.DeletedCount > 0)
MessageBox.Show(“xóa thành công”);
else
MessageBox.Show(“xóa thất bại”);
}
private void btnXoa_Click(object sender, RoutedEventArgs e)
{
XuLyXoa();
}
private void mnuXoa_Click(object sender, RoutedEventArgs e)
{
XuLyXoa();
}

[/code]

Chạy chương trình lên ta có được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code xóa Sản phẩm

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật dùng Android – Kotlin để tương tác với dữ liệu MongoDB, các bạn chú ý theo dõi.

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!

Bài 11-Sửa dữ liệu MongoDB trong C#-WPF

bài 10, chúng ta đã biết cách thêm một dữ liệu vào MongoDB như thế nào, cũng như biết được thuật ngữ CRUD. Bài này Tui sẽ hướng dẫn các bạn cách sửa dữ liệu, cũng dùng project và dữ liệu trong bài 10.

Mục tiêu bài này Ta phải làm được như sau:

– mô tả sơ sơ nha: Double click vào dòng listview item hoặc click vào nút Sửa sẽ hiển thị Cửa sổ sửa Sản phẩm cùng với các dữ liệu của dòng được chọn. Lưu ý mọi thứ dùng Binding nha.

Đây là coding để cập nhật dữ liệu vào MongoDB:

[code language=”csharp”]

MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
FilterDefinition filter =Builders.Filter.Eq(“Ma”,”P1″);
UpdateDefinition update =Builders.Update
.Set(“Ten”, “Mắm tôm”)
.Set(“DonGia”, 113);

collection.UpdateOne(filter, update);

[/code]

Đoạn Coding trên giúp Ta cập nhật Product có mã P1. Cụ thể: Nó sẽ tìm Product có mã P1, khi tìm thấy, nó sẽ thay đổi Tên của Product này thành “Mắm tôm”giá của Product này thành 113

Các bạn có thể bắt chước và suy luận ra để làm cho các trường hợp khác.

Chi tiết chức năng này như sau:

Trước tiên ta phải tạo một giao diện Sửa Product mà sử dụng Binding dữ liệu, ta new 1 giao diện tên “SuaSanPham.xaml”giống như màn hình ThemSanPham.xaml:

[code language=”xml”]

[/code]

Trong màn hình Sửa ở trên, thấy tui để Binding không? có mã, tên, đơn giá đó. Nó sẽ được gán DataContext khi gọi màn hình này.

Ta xem Coding của SuaSanPham.xaml.cs:

[code language=”csharp”]

using MongoDB.Bson;
using MongoDB.Driver;
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.Shapes;

namespace CRUD_MongoCSharp
{
///

/// Interaction logic for SuaSanPham.xaml
///

public partial class SuaSanPham : Window
{

public SuaSanPham()
{
InitializeComponent();
}

private void btnLuu_Click(object sender, RoutedEventArgs e)
{
try
{
//lấy Context là đối tượng Product được gán trong màn hình MainWindow
Product p = DataContext as Product;

MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
FilterDefinition filter =Builders.Filter.Eq(“Ma”, p.Ma);
UpdateDefinition update =Builders.Update
.Set(“Ten”, p.Ten)
.Set(“DonGia”, p.DonGia);

collection.UpdateOne(filter, update);
MessageBox.Show(“Update thành công”);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void btnHuy_Click(object sender, RoutedEventArgs e)
{
Close();
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{

}
}
}

[/code]

Đoạn coding ở trên giúp chúng ta lấy dữ liệu của Product được thay đổi trên giao diện, lưu xuống cơ sở dữ liệu. Chú ý đang Binding nên nó tự động Đồng bộ giữa Giao diện và model nha (thay đổi trên giao diện, nó tự động hiểu đối tượng thay đổi, chỗ nào có tham chiếu nó chạy theo luôn. Do đó  ở màn hình sửa này nè, bạn mà đổi dữ liệu trên giao diện thì quan sát màn hình chính nó tự chạy theo do nó đang cùng tham chiếu một ô nhớ).

Tiếp theo ta xem coding mở màn hình sửa nhé

  • Vì Ta có 2 trường hợp mở màn hình sửa: Double click  vào List View và click vào nút Sửa. Nên bạn tự tìm chỗ sự kiện gán cho nó nha (trong cửa sổ Property thấy mục Event chọn Mouse Double click cho ListView), còn Button thì cứ double click trực tiếp vào nó là OK:

Coding xử lý mở màn hình sửa:

[code language=”csharp”]

private void MoManHinhSua()
{
if (lvProduct.SelectedIndex == -1)
return;
SuaSanPham suaWindow = new SuaSanPham();
Product p = lvProduct.SelectedItem as Product;
suaWindow.DataContext = p;
suaWindow.ShowDialog();
}
private void btnSua_Click(object sender, RoutedEventArgs e)
{
MoManHinhSua();
}
private void lvProduct_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
MoManHinhSua();
}

[/code]

Chạy chương trình lên ta có được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code sửa Sản phẩm

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật tương tác dữ liệu (xóa), các bạn chú ý theo dõi.

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!

Bài 10-Thêm dữ liệu vào MongoDB trong C#-WPF

CRUD là một thuật ngữ nói về các thao tác: Thêm, Xem, Sửa Xóa.

C (Create->Insert dữ liệu mới)

R (Retrieve -> Select truy vấn dữ liệu)

U (Update -> Cập nhật dữ liệu)

D (Delete -> Xóa dữ liệu)

Bất kỳ một phần mềm quản lý nào cũng phải có tối thiểu cung cấp được CRUD cho người dùng tương tác.

Kết thúc bài hướng dẫn này bạn phải làm được chức năng Lưu dữ liệu, chức năng Xem ta đã làm ở các bài học trước rồi. Kết quả bạn phải làm được giao diện và tương tác dữ liệu như màn hình dưới đây:

– Chức năng hiển thị toàn bộ Product trong cơ sơ dữ liệu MongoDB lên giao diện các bạn tự xem lại các bài học:

Bài 5-Kết nối và truy vấn dữ liệu MongoDB bằng C#

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

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

Bài 8 – Kỹ thuật Binding dữ liệu MongoDB lên ListView WPF

Bài 9- Kỹ thuật sắp xếp dữ liệu MongoDB bằng C#

– Chức năng thêm mới dữ liệu:

Khi bấm vào nút Thêm sẽ mở ra màn hình mới để người dùng cung cấp: Mã , tên, đơn giá. Khi bấm lưu sẽ lưu dữ liệu này vào MongoDB.

Với MongoDB thì mỗi một dữ liệu chúng ta đẩy vào chính là 1 BsonDocument (trong SQL Server gọi là record). Bạn có thể so sánh tham chiếu từ Cơ sở dữ liệu quan hệ qua NoSQL như sau:

Tui giải thích sơ qua: Ở Cơ sở dữ liệu quan hệ ta có 2 bảng Person và Car. Mỗi bảng có dòng và cột. Thì nó sẽ mapping qua BSon: 1 Person có nhiều Car nên ta có 1 JSonObject ở ngoài và ở bên trong là JSonArray (cars).

Dưới đây là hình mô tả sự khác biệt giữa JSon và Bson. Json Tui có giải thích sơ bộ ở bài này.

Để lưu dữ liệu vào MongoDB thì bước trước tiên ta phải tạo 1 đối tượng là BSonDocument:

[code language=”csharp”]

private void btnLuu_Click(object sender, RoutedEventArgs e)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
BsonDocument document = new BsonDocument
{
{ “Ma”,”P8″},
{ “Ten”,”Thuốc trị hôi nách”},
{ “DonGia”,19.5},
};
collection.InsertOne(document);
MessageBox.Show(“Đã lưu thành công”);
}

[/code]

Ta thấy Tui khai báo 1 BsonDocument, tạo các thuộc tính: Ma, Ten, DonGia (3 thuộc tính này phải so khớp chính xác trong bảng Product của MongoDB).

Sau đó gọi lệnh InsertOne(document) ==> lưu vào Cơ sở dữ liệu.

Lưu ý nó còn vài cách lưu khác nữa, ta chưa bàn ở chỗ này.

Bây giờ ta tạo 1 Project tên là “CRUD_MongoCSharp“, rồi tiến hành tạo giao diện và xử lý nghiệp vụ như hướng dẫn chi tiết dưới này:

Chi tiết XAML cho giao diện chính: (MainWindow.xaml):

[code language=”xml”]

[/code]

Coding model cho bảng Product:

[code language=”csharp”]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CRUD_MongoCSharp
{
public class Product
{
public object _id { get; set; }
public string Ma { get; set; }
public string Ten { get; set; }
public double DonGia { get; set; }
}
}

[/code]

Chi tiết coding MainWindow.xaml.cs:

[code language=”java”]

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;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
namespace CRUD_MongoCSharp
{
///

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

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

private void Window_Loaded(object sender, RoutedEventArgs e)
{
LoadAllProduct();
}
private void LoadAllProduct()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
List documents = collection.Find(new BsonDocument()).ToList();
List dsProduct = new List();
foreach(BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

private void btnThem_Click(object sender, RoutedEventArgs e)
{
ThemSanPham frm = new ThemSanPham();
frm.ShowDialog();
}

private void btnXem_Click(object sender, RoutedEventArgs e)
{
LoadAllProduct();
}
}
}

[/code]

Giao diện ThemSanPham.xaml:

[code language=”xml”]

[/code]

Coding màn hình Thêm dữ liệu (ThemSanPham.xaml.cs):

[code language=”csharp”]

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.Shapes;
using MongoDB;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
namespace CRUD_MongoCSharp
{
///

/// Interaction logic for ThemSanPham.xaml
///

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

private void btnDong_Click(object sender, RoutedEventArgs e)
{
Close();
}

private void btnTiep_Click(object sender, RoutedEventArgs e)
{
txtMa.Clear();
txtTen.Clear();
txtDonGia.Clear();
txtMa.Focus();
}
private void btnLuu_Click(object sender, RoutedEventArgs e)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
BsonDocument document = new BsonDocument
{
{ “Ma”,txtMa.Text},
{ “Ten”,txtTen.Text},
{ “DonGia”,txtDonGia.Text},
};
collection.InsertOne(document);
MessageBox.Show(“Đã lưu thành công”);
}
}
}

[/code]

Chạy chương trình lên ta có được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code thêm Sản phẩm

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật tương tác dữ liệu (sửa, xóa), các bạn chú ý theo dõi.

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!

Bài 9- Kỹ thuật sắp xếp dữ liệu MongoDB bằng C#

bài 8 ta đã biết cách Binding dữ liệu lên LiewView trong WPF, bài này Tui sẽ hướng dẫn các bạn sắp xếp dữ liệu theo nhiều cách khác nhau.

Dữ liệu bảng Product bạn tải về để sử dụng: Product.json

Cụ thể ta sẽ làm các chức năng sau:

  1. Tải toàn bộ dữ liệu trong bảng Product (Try 1)
  2. Tải toàn bộ dữ liệu trong bảng Product và sắp xếp theo đơn giá tăng dần (Try 2)
  3. Tải toàn bộ dữ liệu trong bảng Product và sắp xếp theo đơn giá giảm dần (Try 3)
  4. Lọc Product theo đơn giá [a…b] (Try  4)
  5. Lọc Product theo đơn giá [a…b] và sắp xếp (Try 5)
  6. Tải toàn bộ dữ liệu trong bảng Product và sắp xếp theo đơn giá tăng dần, nếu đơn giá trùng nhau thì sắp xếp theo Mã giảm dần (Try 6)
  7. Thoát

Kết thúc bài học bạn phải làm được chương trình như hình dưới đây:

Để sắp xếp dữ liệu trong quá trình truy vấn ta dùng đối tượng: Builders<BsonDocument>.Sort

Trong đối tượng này có rất nhiều phương thức, ta quan tâm 2 phương thức chính đã là Sắp tăng dần (Ascending) và Sắp giảm dần (Descending).

Ví dụ: Muốn viết lệnh sắp xếp Product theo Cột Đơn Giá tăng dần:

var sort = Builders<BsonDocument>.Sort.Ascending(“DonGia”);

Ví dụ: Muốn viết lệnh sắp xếp Product theo Cột Đơn Giá Giảm dần:
var sort = Builders<BsonDocument>.Sort.Descending(“DonGia”);

Tương tự như vậy, nếu bạn muốn sắp xếp cột nào thì thay DonGia bằng Cột bạn muốn sắp xếp.

Sau đó ta truyền đối tượng sort vào lệnh truy 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 rồi):

List<BsonDocument> documents = collection.Find(new BsonDocument()).Sort(sort).ToList();

Ví dụ: Sắp xếp kết hợp nhiều cột:

var sort = Builders<BsonDocument>.Sort.Ascending(“DonGia”).Descending(“Ma”);

Lệnh trên có nghĩa: Sắp xếp theo đơn giá tăng dần, nếu đơn giá trùng nhau thì sắp xếp theo Mã giảm dần.

OK, let’s go. Bây giờ ta tạo một Project tên : SortMongoDBCSharp, cách tham chiếu thư viện MongoDB driver bạn tự xem lại bài 4. Trong bài này Tui đi thẳng vào thiết kế giao diện và xử lý các hàm truy vấn dữ liệu và sắp xếp ở trên.

Thiết kế giao diện MainWindow.xaml:

[code language=”xml”]

[/code]

Xử lý coding cho MainWindow.xaml.cs:

0. Lớp Product để ta convert qua Model cho lẹ:

[code language=”csharp”]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SortMongoDBCSharp
{
public class Product
{
public object _id { get; set; }
public string Ma { get; set; }
public string Ten { get; set; }
public double DonGia { get; set; }
}
}

[/code]

Chú ý lớp này Tui cũng đã giải thích ở bài 8

1.Tải toàn bộ dữ liệu trong bảng Product (Try 1)

[code language=”csharp”]

private void btnTry1_Click(object sender, RoutedEventArgs e)
{
LoadAll();
}
private void LoadAll()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
List documents = collection.Find(new BsonDocument()).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

[/code]

Đoạn lệnh trên ta đã rất quen thuộc, đó là tải toàn bộ sản phẩm lên giao diện.

Kết quả:

2.Tải toàn bộ dữ liệu trong bảng Product và sắp xếp theo đơn giá tăng dần (Try 2)

[code language=”csharp”]

private void btnTry2_Click(object sender, RoutedEventArgs e)
{
LoadAll_Sort_Ascending();
}
private void LoadAll_Sort_Ascending()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var sort = Builders.Sort.Ascending(“DonGia”);

List documents = collection.Find(new BsonDocument()).Sort(sort).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

[/code]

Đoạn coding ở trên ta thấy:

var sort = Builders<BsonDocument>.Sort.Ascending(“DonGia”);

dùng để tạo đối tượng Sort tăng dần theo cột đơn giá.

Còn lệnh dưới đây là gán đối tượng Sort đó vào hàm lấy danh sách. Như vậy sau khi truy vấn nó sẽ sắp xếp dữ liệu theo cột đơn giá:

List<BsonDocument> documents = collection.Find(new BsonDocument()).Sort(sort).ToList();

Kết quả:

3.Tải toàn bộ dữ liệu trong bảng Product và sắp xếp theo đơn giá giảm dần (Try 3)

[code language=”csharp”]

private void btnTry3_Click(object sender, RoutedEventArgs e)
{
LoadAll_Sort_Descending();
}
private void LoadAll_Sort_Descending()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var sort = Builders.Sort.Descending(“DonGia”);

List documents = collection.Find(new BsonDocument()).Sort(sort).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

[/code]

Đoạn coding ở trên ta thấy:

var sort = Builders<BsonDocument>.Sort.Descending(“DonGia”);

dùng để tạo đối tượng Sort giảm dần theo cột đơn giá.

Còn lệnh dưới đây là gán đối tượng Sort đó vào hàm lấy danh sách. Như vậy sau khi truy vấn nó sẽ sắp xếp dữ liệu theo cột đơn giá:

List<BsonDocument> documents = collection.Find(new BsonDocument()).Sort(sort).ToList();

Kết quả:

4.Lọc Product theo đơn giá [a…b] (Try  4)

[code language=”csharp”]

private void btnTry4_Click(object sender, RoutedEventArgs e)
{
LoadFilterProduct(150, 250);
}
private void LoadFilterProduct(double min,double max)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var filter = Builders.Filter.Gte(“DonGia”, min) & Builders.Filter.Lte(“DonGia”, max);
List documents = collection.Find(filter).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

[/code]

Ở trên Tui viết riêng một hàm LoadFilterProduct(double min,double max) lọc Product theo đơn giá Min và max. các Em chỉ cần gọi hàm và truyền giá trị vào mà thôi nên rất tiện lợi. Cách lọc này Ta cũng đã được học kỹ trong bài 7.

Kết quả:

5.Lọc Product theo đơn giá [a…b] và sắp xếp đơn giá giảm dần (Try 5)

[code language=”csharp”]

private void btnTry5_Click(object sender, RoutedEventArgs e)
{
LoadFilter_Sort_Descending(150, 250);
}
private void LoadFilter_Sort_Descending(double min, double max)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var filter = Builders.Filter.Gte(“DonGia”, min) & Builders.Filter.Lte(“DonGia”, max);
var sort = Builders.Sort.Descending(“DonGia”);
List documents = collection.Find(filter).Sort(sort).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

[/code]

Tương tự như try 4, ở đây Tui tạo hàm độc lập LoadFilter_Sort_Descending(double min, double max)  và kết hợp thêm Sort giảm dần. Như vậy vừa filter vừa sort giảm dần (bạn có thể áp dụng cho tăng dần).

Kết quả:

6.Tải toàn bộ dữ liệu trong bảng Product và sắp xếp theo đơn giá tăng dần, nếu đơn giá trùng nhau thì sắp xếp theo Mã giảm dần (Try 6)

Đây là một trong nhưng yêu cầu được sử dụng rất nhiều trong phần mềm. Ta làm như sau:

[code language=”csharp”]

private void btnTry6_Click(object sender, RoutedEventArgs e)
{
LoadAll_Sort_Ascending_Descending();
}

private void LoadAll_Sort_Ascending_Descending()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);

var sort = Builders.Sort.Ascending(“DonGia”).Descending(“Ma”);

List documents = collection.Find(new BsonDocument()).Sort(sort).ToList();

List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

[/code]

Bạn quan sát:

var sort = Builders<BsonDocument>.Sort.Ascending(“DonGia”).Descending(“Ma”);

Là sự kết hợp của nhiều yêu cầu Sort. Cụ thể: Sắp xếp Đơn giá tăng dần, nếu đơn giá trùng nhau thì sắp xếp theo Mã giảm dần. Bạn có thể áp dụng để làm các yêu cầu tương tự.

Kết quả:

Bạn quan sát, Sản phẩm Sting Lavie có đơn giá trùng nhau. Nó sẽ sắp xếp giảm dần về Mã, Tức là Sting có mã P6 sẽ được liệt kê trước sản phẩm Lavie có mã là P4.

7.Thoát

Rất đơn giá, chỉ cần gọi lệnh Close();

[code language=”csharp”]

private void btnExit_Click(object sender, RoutedEventArgs e)
{
Close();
}

[/code]

Dưới đây là tổng hợp XAML và Coding đầy đủ:

MainWindow.xaml:

[code language=”xml”]

[/code]

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

[code language=”csharp”]

using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
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;

namespace SortMongoDBCSharp
{
///

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

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

private void Window_Loaded(object sender, RoutedEventArgs e)
{

}
private void btnExit_Click(object sender, RoutedEventArgs e)
{
Close();
}

private void btnTry1_Click(object sender, RoutedEventArgs e)
{
LoadAll();
}
private void LoadAll()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
List documents = collection.Find(new BsonDocument()).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

private void btnTry2_Click(object sender, RoutedEventArgs e)
{
LoadAll_Sort_Ascending();
}
private void LoadAll_Sort_Ascending()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var sort = Builders.Sort.Ascending(“DonGia”);

List documents = collection.Find(new BsonDocument()).Sort(sort).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

private void btnTry3_Click(object sender, RoutedEventArgs e)
{
LoadAll_Sort_Descending();
}
private void LoadAll_Sort_Descending()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var sort = Builders.Sort.Descending(“DonGia”);

List documents = collection.Find(new BsonDocument()).Sort(sort).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

private void btnTry4_Click(object sender, RoutedEventArgs e)
{
LoadFilterProduct(150, 250);
}
private void LoadFilterProduct(double min,double max)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var filter = Builders.Filter.Gte(“DonGia”, min) & Builders.Filter.Lte(“DonGia”, max);
List documents = collection.Find(filter).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

private void btnTry5_Click(object sender, RoutedEventArgs e)
{
LoadFilter_Sort_Descending(150, 250);
}
private void LoadFilter_Sort_Descending(double min, double max)
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);
var filter = Builders.Filter.Gte(“DonGia”, min) & Builders.Filter.Lte(“DonGia”, max);
var sort = Builders.Sort.Descending(“DonGia”);
List documents = collection.Find(filter).Sort(sort).ToList();
List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}

private void btnTry6_Click(object sender, RoutedEventArgs e)
{
LoadAll_Sort_Ascending_Descending();
}

private void LoadAll_Sort_Ascending_Descending()
{
MongoClient client = new MongoClient(“mongodb://localhost:27017”);
IMongoDatabase database = client.GetDatabase(“QuanLySanPham”);
IMongoCollection collection = database.GetCollection(“Product”);

var sort = Builders.Sort.Ascending(“DonGia”).Descending(“Ma”);

List documents = collection.Find(new BsonDocument()).Sort(sort).ToList();

List dsProduct = new List();
foreach (BsonDocument document in documents)
{
Product p = BsonSerializer.Deserialize(document);
dsProduct.Add(p);
}
lvProduct.ItemsSource = dsProduct;
}
}
}

[/code]

Chạy chương trình lên ta có được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source sorting

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật tương tác dữ liệu (thêm, sửa, xóa), các bạn chú ý theo dõi.

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!

Bài 8 – Kỹ thuật Binding dữ liệu MongoDB lên ListView WPF

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 các bạn kỹ thuật Binding dữ liệu MongoDB lên ListView trong WPF như thế nào. Đây là một trog những bài toán mà chúng ta thường gặp khi triển khai dự án.

Kết thúc bài này bạn phải làm được chương trình như dưới đây:

Bước 1:

Ta tạo một Project tên là BindingMongoDBCSharp, cách tham chiếu Driver MongoDB cho C# Các bạn phải tự xem lại bài 4, trong bài này Tui không nói lại nữa.

Bước 2:

Tạo Model class tên là Product trong C# (bấm chuột phải vào Project/ Add/ new Class), Thuộc tính của lớp Product này sẽ match đúng với thuộc tính khai báo trong MongoDB Compass (xem lại cơ sở dữ liệu trình bày trong bài 3):

[code language=”csharp”]

using MongoDB.Bson;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BindingMongoDBCSharp
{
public class Product
{
public object _id { get; set; }
public string Ma { get; set; }
public string Ten { get; set; }
public double DonGia { get; set; }
}
}

[/code]

Bước 3:

Thiết kế giao diện cho phần mềm, dùng ListView, cấu hình các thuộc tính để Binding (MainWindow.xaml):

[code language=”xml”]

[/code]

Lưu ý, control ListView bạn kéo thả trực tiếp từ thanh toolbox vào. Sau đó định nghĩa các Cột:

Header=”Ma”==>cột Mã (hiển thị gì  bạn tự gõ vào đây, tên gì cũng được miễn sao phù hợp)

Header=”Tên”==>cột Tên (tương tự).

Header=”Đơn Giá”==>cột Đơn giá (tương tự)

Trong mỗi Column, các Em chú ý Tui để thuộc tính DisplayMemberBinding có giá trị {Binding Ma} , {Binding Ten}, {Binding DonGia} . Lưu ý các chữ Ma, Ten, DonGia là các thuộc tính của lớp mà ta muốn Binding, tức là nó phải đúng chính xác thuộc tính mà ta khai báo cho Lớp Product(Xem lại Lớp Product ở trên)

Ta đổ dữ liệu vào ListView này bằng lệnh ItemsSource. Nó sẽ tự đưa các giá trị tương ứng với các thuộc tính Ma, Ten, DonGia lên giao diện (Binding).

Bước 4:

Coding cho MainWindow.xaml.cs:

[code language=”csharp”]

using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver;
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;

namespace BindingMongoDBCSharp
{
///

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

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

private void btnLoadProduct_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();

List dsProduct = new List();
foreach (BsonDocument document in documents)
{
//Convert BsonDocument về C# model class:
dsProduct.Add(BsonSerializer.Deserialize(document));
}
//đổ dữ liệu lên ListView
lvProduct.ItemsSource = dsProduct;
}
}
}

[/code]

Coding ở trên có 3 nhiệm vụ:

  • Nhiệm vụ 1: Kết nối và lấy dữ liệu từ bảng Product trong MongoDB
  • Nhiệm vụ 2: Convert BSonDocument về Model class C#, đưa vào List<Product>dsProduct (tên của ListView)
  • Nhiệm vụ 3: Đổ List<Product> lên ListView bằng lệnh lvProduct.ItemsSource=dsProduct

Chạy chương trình lên ta có được kết quả như mong muốn.

Các bạn có thể tải source code đầy đủ ở đây: Source code Binding

Bài học Sau Tui sẽ hướng dẫn các bạn các kỹ thuật Sắp xếp dữ liệu trong MongoDB bằng C#-WPF, các bạn chú ý theo dõi.

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!

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

[code language=”csharp”]

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

[/code]

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

[code language=”csharp”]

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

[/code]

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

[code language=”csharp”]

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

[/code]

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

[code language=”csharp”]

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

[/code]

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

[code language=”csharp”]

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

[/code]

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

[code language=”csharp”]

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

[/code]

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

[code language=”csharp”]

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

[/code]

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)

[code language=”csharp”]

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

[/code]

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:

[code language=”xml”]

[/code]

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

[code language=”csharp”]

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

}
}

[/code]

==>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:

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

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

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!