markdown:
[Bài 17-Xóa dữ liệu MongoDB trong Android Kotlin](https://duythanhcse.wordpress.com/2018/06/15/bai-17-xoa-du-lieu-mongodb-trong-android-kotlin/)
Chúc mừng các bạn đã lết được tới bài cuối cùng trong chuỗi bài hướng dẫn tương tác MongoDB trong Android Kotlin, ta đã biết
[, xem](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/) [thêm](https://duythanhcse.wordpress.com/2018/06/13/bai-15-them-moi-du-lieu-vao-mongodb-trong-android-kotlin/), [sửa](https://duythanhcse.wordpress.com/2018/06/14/bai-16-sua-du-lieu-mongodb-trong-android-kotlin/)và giờ là thao tác Xóa. Kết thúc bài này ta đã hoàn thành sứ mệnh **CRUD**, tập các nghiệp vụ thiết yếu phải có trong các phần mềm quản lý liên quan tới CSDL.
Tương tự như
[bài 16](https://duythanhcse.wordpress.com/2018/06/14/bai-16-sua-du-lieu-mongodb-trong-android-kotlin/), Tui di chuyển quán Cafe khác nha, lần này IP của máy Tui là: **192.168.1.137**, các Thím nhớ cấu hình lại file mongodb.cfg và chạy lại Service như Tui đã nhắc nhở trong [bài 14](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/) nha.
Kết thúc bài hướng dẫn này bạn phải làm được giao diện Xóa như sau:
[Nhấn vào biểu tượng thùng rác để xóa.](https://duythanhcse.wordpress.com/2018/06/15/bai-17-xoa-du-lieu-mongodb-trong-android-kotlin/mongodb116/)
Coding xóa 1 Product khỏi MongoDB trong Android Kotlin ta làm như sau:
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 filter = Filters.eq("Ma", "P1") collection.deleteOne(filter) } catch (ex: Exception) { Log.e("LOI", ex.toString()) }
Coding ở trên ta xóa Product có mà là P1 (tìm nó trước dùng lệnh
**eq**), dùng lệnh **deleteOne** để xóa.
còn nữa…
[Bài 16-Sửa dữ liệu MongoDB trong Android Kotlin](https://duythanhcse.wordpress.com/2018/06/14/bai-16-sua-du-lieu-mongodb-trong-android-kotlin/)
Như vậy bạn đã biết cách truy xuất và thêm mới dữ liệu vào MongoDB trong Android Kotlin, bài này ta tiếp tục với phần chỉnh sửa dữ liệu. Tương tự như
[bài 15](https://duythanhcse.wordpress.com/2018/06/13/bai-15-them-moi-du-lieu-vao-mongodb-trong-android-kotlin/), Tui di chuyển quán Cafe khác nha, lần này IP của máy Tui là: **172.16.96.86**, các Thím nhớ cấu hình lại file mongodb.cfg và chạy lại Service như Tui đã nhắc nhở trong [bài 14](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/) nha.
Nếu IP mà bị đổi mà các bạn không cấu hình và chạy lại Service thì khóc ra tiếng Miên MongoDB cũng không thể nào hoạt động được.
Ta tiếp tục mở lại Project trong
[bài 15](https://duythanhcse.wordpress.com/2018/06/13/bai-15-them-moi-du-lieu-vao-mongodb-trong-android-kotlin/) nha, Kết thúc bài học này thím phải làm được giao diện như sau: [Ta cần tạo một màn hình chỉnh sửa dữ liệu, màn hình này sẽ có 2 chức năng: Tìm kiếm Product theo Mã và Cho phép cập nhật dữ liệu (nhìn màn hình điện thoại thứ nhất).](https://duythanhcse.wordpress.com/2018/06/14/bai-16-sua-du-lieu-mongodb-trong-android-kotlin/mongodb105/)
Xem cấu trúc mới sau khi làm chức năng sửa:
Ta tạo một Activity tên là :
**SuaProductActivity**, XML layout như sau:
<?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=".SuaProductActivity"> <TextView android:id="@+id/textView4" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Nhập mã tìm kiếm:" android:background="@color/maunentieude" android:textColor="@color/mauchutieude" android:textSize="20sp" /> <EditText android:id="@+id/edtMaTim" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="textPersonName" /> <Button android:onClick="xuLyTimProduct" android:id="@+id/btnTim" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Tìm" /> <TextView android:id="@+id/textView5" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Mã Product:" android:background="@color/maunentieude" android:textColor="@color/mauchutieude" 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/textView6" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Tên Product:" android:background="@color/maunentieude" android:textColor="@color/mauchutieude" 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/textView7" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Đơn giá:" android:background="@color/maunentieude" android:textColor="@color/mauchutieude" android:textSize="20sp" /> <EditText android:id="@+id/edtDonGia" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" android:text="" /> <Button android:onClick="xuLySuaProduct" android:id="@+id/btnCapNhat" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Cập nhật Product" /> </LinearLayout>
Phần Coding trong màn hình SuaProductActivity ta phải sử dụng 2 AsyncTask: Cho Tìm Kiếm và cho phần Chỉnh sửa.
[Dữ liệu mới nhất Product.json bạn có thể tải tại đây](http://www.mediafire.com/file/9jeq6lg6dwr0tqe/Product.json)
Để tìm kiếm Product theo mã (trên giao diện bạn thấy Tui để phần tìm kiếm đó):
var connectionString = MongoClientURI("mongodb://172.16.96.86:27017") var mongoClient = MongoClient(connectionString) var database = mongoClient.getDatabase("QuanLySanPham") var collection = database.getCollection("Product") var filter = Filters.eq("Ma", "p999") var cursor = collection.find(filter).first() if(cursor==null) return null var data = cursor.toJson() var jsonObject = JSONObject(data) var ma = jsonObject.getString("Ma") var ten = jsonObject.getString("Ten") var gia = jsonObject.getDouble("DonGia")
Coding ở trên là tìm Product có mã
**p999** nha các Thím. Nếu tìm thấy thì ta đưa về Json để móc nối lấy ra được giá trị của các thuộc tính: Ma, Ten, DonGia (xem coding ở trên)
Coding chỉnh sửa ta làm như sau:
var connectionString = MongoClientURI("mongodb://172.16.96.86:27017") var mongoClient = MongoClient(connectionString) var database = mongoClient.getDatabase("QuanLySanPham") var collection = database.getCollection("Product") var filter = Filters.eq("Ma", "p999") var editDoc = Document("\$set", Document("DonGia", 325) .append("Ten", "Thuốc trị hôi nách Campuchia")) var ret:UpdateResult = collection.updateOne(filter, editDoc) return ret.modifiedCount>0
Để chỉnh sửa, thì ta tìm ra Sản Phẩm có mã p999 trước, sau khi tìm kiếm được rồi ta đưa vào Document(“\$set“…) ở trên. Muốn đổi giá trịcuar thuộc tính nào thì cứ đưa vào Document ở đối số thứ 2, các thuộc tính tiếp theo đưa vào append.
lệnh ret.modifiedCount trả về số phần tử bị thay đổi. Tui so sánh với >0 để cho ra true, false thôi không có gì. Muốn dùng true false thì viết như Tui ở trên, còn không thì cứ để giá trị đó là biết ngay thanh công hay thất bại.
Coding chi tiết của lớp này
**SuaProductActivity** nè:
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 org.json.JSONObject import com.mongodb.client.model.Filters import com.mongodb.MongoClientURI import com.mongodb.client.result.UpdateResult import org.bson.Document class SuaProductActivity : AppCompatActivity() { lateinit var edtMaTim:EditText lateinit var edtMa:EditText lateinit var edtTen:EditText lateinit var edtDonGia:EditText override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_sua_product) addControls() } private fun addControls() { edtMaTim=findViewById(R.id.edtMaTim) edtMa=findViewById(R.id.edtMa) edtTen=findViewById(R.id.edtTen) edtDonGia=findViewById(R.id.edtDonGia) } fun xuLyTimProduct(view:View) { var maTim:String=edtMaTim.text.toString() TimProducTask().execute(maTim) } inner class TimProducTask:AsyncTask<String,Void,Product?>() { override fun doInBackground(vararg p0: String?): Product? { var product:Product?=null try { var connectionString = MongoClientURI("mongodb://172.16.96.86:27017") var mongoClient = MongoClient(connectionString) var database = mongoClient.getDatabase("QuanLySanPham") var collection = database.getCollection("Product") var filter = Filters.eq("Ma", p0[0]) var cursor = collection.find(filter).first() if(cursor==null) return null var data = cursor.toJson() var jsonObject = JSONObject(data) var ma = jsonObject.getString("Ma") var ten = jsonObject.getString("Ten") var gia = jsonObject.getDouble("DonGia") product=Product(ma,ten,gia) } catch (ex: Exception) { Log.e("LOI", ex.toString()) } return product } override fun onPostExecute(result: Product?) { super.onPostExecute(result) if(result!=null) { edtMa.setText(result.Ma) edtTen.setText(result.Ten) edtDonGia.setText(result.DonGia.toString()) } else { Toast.makeText( applicationContext,"Ko tìm thấy",Toast.LENGTH_LONG ).show() } } } fun xuLySuaProduct(view:View) { var p:Product= Product(edtMa.text.toString(),edtTen.text.toString(),edtDonGia.text.toString().toDouble()) SuaProductTask().execute(p) } inner class SuaProductTask : AsyncTask<Product,Void,Boolean>() { override fun doInBackground(vararg p0: Product?): Boolean { try { var p:Product?=p0[0] if(p==null)return false var connectionString = MongoClientURI("mongodb://172.16.96.86:27017") var mongoClient = MongoClient(connectionString) var database = mongoClient.getDatabase("QuanLySanPham") var collection = database.getCollection("Product") var filter = Filters.eq("Ma", p.Ma) var editDoc = Document("\$set", Document("DonGia", p.DonGia) .append("Ten", p.Ten)) var ret:UpdateResult = collection.updateOne(filter, editDoc) return ret.modifiedCount>0 } catch (ex: Exception) { Log.e("LOI", ex.toString()) } return false } override fun onPostExecute(result: Boolean?) { super.onPostExecute(result) if(result==true) { Toast.makeText(applicationContext,"Sửa Product thành công",Toast.LENGTH_LONG).show() } else { Toast.makeText(applicationContext,"Sửa Product thất bại",Toast.LENGTH_LONG).show() } } } }
Trong MainActivity ta bổ sung thêm sự kiện mở
**SuaProductActivity**:
fun suaProduct(view:View) { var intent= Intent(this,SuaProductActivity::class.java) startActivity(intent) }
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 sửa dữ liệu MongoDB trong Android Kotlin.](http://www.mediafire.com/file/u27v82264jdt2l4/AndroidKotlinToMongoDB_sua.rar)
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 ( 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:
[http://communityuni.com/](http://communityuni.com/)
Chúc các bạn thành công!
[Bài 15- Thêm mới dữ liệu vào MongoDB trong Android Kotlin](https://duythanhcse.wordpress.com/2018/06/13/bai-15-them-moi-du-lieu-vao-mongodb-trong-android-kotlin/)
Ở
[bài 14](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/) 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](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/) 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](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/) để 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:
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)
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.](https://duythanhcse.wordpress.com/2018/06/13/bai-15-them-moi-du-lieu-vao-mongodb-trong-android-kotlin/mongodb104/)
Giao diện XML như sau:
<?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>
Giao diện khi chạy lên sẽ như sau:
[Tiếp tục ta bổ sung coding cho ](https://duythanhcse.wordpress.com/2018/06/13/bai-15-them-moi-du-lieu-vao-mongodb-trong-android-kotlin/mongodb100/) **ThemProductActivity**:
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(); } } } }
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](https://duythanhcse.wordpress.com/kotlin/kotlin-co-ban-den-nang-cao/) 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](https://communityuni.com/Home/KotlinToanTap).
Bây giờ trong MainActivity ta gọi lệnh mở màn hình ThemProductActivity:
fun ThemProduct(view:View) { var intent= Intent(this,ThemProductActivity::class.java) startActivity(intent) }
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.](http://www.mediafire.com/file/5x6il9r8bslf5gj/AndroidKotlinToMongoDB_ThemMoi.rar)
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:
[http://communityuni.com/](http://communityuni.com/)
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](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/)
Ở
[bài 13](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/) 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 Ở ](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb98_result/) [bài 13](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/)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:
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.](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb85-1/)
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:](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb86/) [Ta đổi Activity name thành XemProductActivity:](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb87/) [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 ](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb88/) **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ư ](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb89/) **RecyclerView**chẳng hạn)..
XML của màn hình XemProduct:
Xem phần Design:
[Ta sẽ viết thêm 1 lớp model ](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb90/) **Product**để mô hình hóa dữ liệu từ MongoDB về Kotlin class ( [tương tự như C# mà ta đã được học](https://duythanhcse.wordpress.com/2018/05/31/bai-8-ky-thuat-binding-du-lieu-mongodb-len-listview-wpf/))
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:](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb91/) [Ta đặt: ](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb92/) **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:](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb93/) [Lúc này màn hình yêu cầu tạo model class được xuất hiện:](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb95/)
Kind: chọn Class
Bấm OK để tạo
Sau đó bổ sung coding cho Product như sau:
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Đ" } }
Lưu ý, chi tiết cách lập trình
[ hướng đối tượng trong Kotlin có thể xem ở đây](https://duythanhcse.wordpress.com/kotlin/kotlin-co-ban-den-nang-cao/) (xem bài [22](https://duythanhcse.wordpress.com/2017/05/31/bai-22-lap-trinh-huong-doi-tuong-trong-kotlin-phan-1/), [23](https://duythanhcse.wordpress.com/2017/06/01/bai-23-lap-trinh-huong-doi-tuong-trong-kotlin-phan-2/), [24](https://duythanhcse.wordpress.com/2017/06/01/bai-24-lap-trinh-huong-doi-tuong-trong-kotlin-phan-3/), [25](https://duythanhcse.wordpress.com/2017/06/01/bai-25-lap-trinh-huong-doi-tuong-trong-kotlin-phan-4/), [26](https://duythanhcse.wordpress.com/2017/06/01/bai-26-lap-trinh-huong-doi-tuong-trong-kotlin-phan-5/), [27](https://duythanhcse.wordpress.com/2017/06/01/bai-27-alias-va-co-che-gom-rac-tu-dong-trong-kotlin-oop-phan-6/), [28](https://duythanhcse.wordpress.com/2017/06/02/bai-28-extensions-method-trong-kotlin-oop-phan-7/)) hoặc các bạn có thể [đăng ký học Kotlin qua Video tại đây](https://communityuni.com/Home/KotlinToanTap).
OK, bây giờ ta quay lại lớp: MainActivity.kt để lập trình, coding:
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) } }
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](https://duythanhcse.wordpress.com/2013/04/02/bai-tap-8-cac-kieu-lap-trinh-su-kien-trong-android/) 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:
var connectionString = MongoClientURI("mongodb://172.16.96.173:27017") var mongoClient = MongoClient(connectionString)
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](https://duythanhcse.wordpress.com/2018/05/27/bai-2-cach-cau-hinh-service-cho-mongodb/) 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](https://duythanhcse.wordpress.com/2018/05/27/bai-3-cach-su-dung-mongodb-compass/).
Giả sử như bạn đã làm rất tốt
[bài 2](https://duythanhcse.wordpress.com/2018/05/27/bai-2-cach-cau-hinh-service-cho-mongodb/) 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 ](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb98-3/) [bài 2](https://duythanhcse.wordpress.com/2018/05/27/bai-2-cach-cau-hinh-service-cho-mongodb/). 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).](https://duythanhcse.wordpress.com/2018/06/12/bai-14-cach-ket-noi-va-truy-suat-du-lieu-mongodb-trong-android-kotlin/mongodb98-2/)
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:
var database = mongoClient.getDatabase("QuanLySanPham")
Để đọc dữ liệu trong bảng nào đó ta làm như sau (giả sử bảng Product):
val collection = database.getCollection("Product")
Sau đó để đọc dữ liệu trong bảng Product ta coding như sau:
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() }
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:
Và đây là coding chi tiết cho màn hình Xem Danh sách product (XemProductActivity):
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) } } }
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.](http://www.mediafire.com/file/vp3qc8i1xn19uuo/AndroidKotlinToMongoDB_truysuat.rar)
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:
[http://communityuni.com/](http://communityuni.com/)
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](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-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](https://duythanhcse.wordpress.com/nodejs-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/](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 ](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb7-1/) [mongo-java-driver-3.7.1.jar](https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/3.7.1/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.](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb7-2/) **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 ](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb734/) **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/](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](http://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:](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb75/) [ở đâ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.](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb76/)
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.](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb77/)
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](https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/3.7.1/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ả:](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb79/) [Rồi mở nhóm app ra/ thấy ](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb80/) **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. [sau đó đưa nó trở thành thư viện như sau: Bấm chuột phải vào nó, chọn ](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb82/) **Ad as Library…**. [Rồi chọn OK khi có cửa sổ dưới đây hiện ra:](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb83/) [Sau khi bấm OK cũng đợi xíu cho Android Studio compile xong nha.](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb84/)
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 ](https://duythanhcse.wordpress.com/2018/06/12/bai-13-cach-tai-va-tham-chieu-driver-mongodb-cho-android-kotlin/mongodb85/) [mongo-java-driver-3.7.1.jar](https://oss.sonatype.org/content/repositories/releases/org/mongodb/mongo-java-driver/3.7.1/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:
[http://communityuni.com/](http://communityuni.com/)
Chúc các bạn thành công!
[Bài 12-Xóa dữ liệu MongoDB trong C#-WPF](https://duythanhcse.wordpress.com/2018/06/09/bai-12-xoa-du-lieu-mongodb-trong-c-wpf/)
Như vậy
**CRUD** ta đã làm được ** bài này sẽ kết thúc CRUD với C, R, U ,** **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.](https://duythanhcse.wordpress.com/2018/06/09/bai-12-xoa-du-lieu-mongodb-trong-c-wpf/mongodb73/)
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:
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");
Coding ở trên sẽ xóa 1 Product có Mã là P3. 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:
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");
Đoạn code ở trên dùng
**để xóa 2 Product** lần lượt có mã là **P2** và **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:
Coding Xử lý cho phần xóa (
**MainWindow.xaml.cs)**:
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(); }
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](http://www.mediafire.com/file/p4ddfp6wpv6tyba/CRUD_MongoCSharp_for_delete.rar/file)
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:
[http://communityuni.com/](http://communityuni.com/)
Chúc các bạn thành công!
[Bài 11-Sửa dữ liệu MongoDB trong C#-WPF](https://duythanhcse.wordpress.com/2018/06/08/bai-11-sua-du-lieu-mongodb-trong-c-wpf/)
Ở
[bài 10](https://duythanhcse.wordpress.com/2018/06/04/bai-10-them-du-lieu-vao-mongodb-trong-c-wpf/), 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](https://duythanhcse.wordpress.com/2018/06/04/bai-10-them-du-lieu-vao-mongodb-trong-c-wpf/).
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.](https://duythanhcse.wordpress.com/2018/06/08/bai-11-sua-du-lieu-mongodb-trong-c-wpf/mongodb72/)
Đây là coding để cập nhật dữ liệu vào MongoDB:
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);
Đ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”** và **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:
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:
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) { } } }
Đ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:
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(); }
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](http://www.mediafire.com/file/gw9j09dc1buu25t/CRUD_MongoCSharp_for_Update.rar/file)
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:
[http://communityuni.com/](http://communityuni.com/)
Chúc các bạn thành công!
[Bài 10-Thêm dữ liệu vào MongoDB trong C#-WPF](https://duythanhcse.wordpress.com/2018/06/04/bai-10-them-du-lieu-vao-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:](https://duythanhcse.wordpress.com/2018/06/04/bai-10-them-du-lieu-vao-mongodb-trong-c-wpf/mongodb69/) [Bài 5-Kết nối và truy vấn dữ liệu MongoDB bằng C#](https://duythanhcse.wordpress.com/2018/05/29/bai-5-ket-noi-va-truy-van-du-lieu-mongodb-bang-c/) [Bài 6-Kỹ thuật Truy vấn với dữ liệu lớn trong MongoDB](https://duythanhcse.wordpress.com/2018/05/29/bai-6-ky-thuat-truy-van-voi-du-lieu-lon-trong-mongodb/) [Bài 7 – Các Kỹ thuật filter dữ liệu trong MongoDB với C#](https://duythanhcse.wordpress.com/2018/05/30/bai-7-cac-ky-thuat-filter-du-lieu-trong-mongodb-voi-c/) [Bài 8 – Kỹ thuật Binding dữ liệu MongoDB lên ListView WPF](https://duythanhcse.wordpress.com/2018/05/31/bai-8-ky-thuat-binding-du-lieu-mongodb-len-listview-wpf/) [Bài 9- Kỹ thuật sắp xếp dữ liệu MongoDB bằng C#](https://duythanhcse.wordpress.com/2018/06/03/bai-9-ky-thuat-sap-xep-du-lieu-mongodb-bang-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).](https://duythanhcse.wordpress.com/2018/06/04/bai-10-them-du-lieu-vao-mongodb-trong-c-wpf/migrating-from-relational-databases-to-mongodb-10-638/)
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](https://duythanhcse.wordpress.com/2014/12/19/bai-51-xu-ly-json-trong-android/). [Để 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:](https://duythanhcse.wordpress.com/2018/06/04/bai-10-them-du-lieu-vao-mongodb-trong-c-wpf/2200-docdb-mongo-fig-5_jsonvsbson/)
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"); }
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**):
Coding model cho bảng Product:
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; } } }
Chi tiết coding
**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; 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(); } } }
Giao diện
**ThemSanPham.xaml**:
Coding màn hình Thêm dữ liệu (
**ThemSanPham.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.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"); } } }
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](http://www.mediafire.com/file/bz6oisk2jfzb0el/CRUD_MongoCSharp.rar/file)
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:
[http://communityuni.com/](http://communityuni.com/)
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#](https://duythanhcse.wordpress.com/2018/06/03/bai-9-ky-thuat-sap-xep-du-lieu-mongodb-bang-c/)
Ở
[bài 8](https://duythanhcse.wordpress.com/2018/05/31/bai-8-ky-thuat-binding-du-lieu-mongodb-len-listview-wpf/) 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](http://www.mediafire.com/file/9jeq6lg6dwr0tqe/Product.json)
Cụ thể ta sẽ làm các chức năng sau:
- Tải toàn bộ dữ liệu trong bảng Product (Try 1)
- 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)
- 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)
- Lọc Product theo đơn giá [a…b] (Try 4)
- Lọc Product theo đơn giá [a…b] và sắp xếp (Try 5)
- 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)
- 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](https://duythanhcse.wordpress.com/2018/06/03/bai-9-ky-thuat-sap-xep-du-lieu-mongodb-bang-c/mongodb62/)
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](https://duythanhcse.wordpress.com/2018/05/29/bai-5-ket-noi-va-truy-van-du-lieu-mongodb-bang-c/), [6](https://duythanhcse.wordpress.com/2018/05/29/bai-6-ky-thuat-truy-van-voi-du-lieu-lon-trong-mongodb/), [7](https://duythanhcse.wordpress.com/2018/05/30/bai-7-cac-ky-thuat-filter-du-lieu-trong-mongodb-voi-c/), [8](https://duythanhcse.wordpress.com/2018/05/31/bai-8-ky-thuat-binding-du-lieu-mongodb-len-listview-wpf/) 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](https://duythanhcse.wordpress.com/2018/05/28/bai-4-driver-net-cho-mongodb-va-cach-tham-chieu-trong-c/). 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**:
Xử lý coding cho
**MainWindow.xaml.cs**: **0. Lớp Product để ta convert qua Model cho lẹ:**
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; } } }
Chú ý lớp này Tui cũng đã giải thích ở
[bài 8](https://duythanhcse.wordpress.com/2018/05/31/bai-8-ky-thuat-binding-du-lieu-mongodb-len-listview-wpf/) **1.Tải toàn bộ dữ liệu trong bảng Product (Try 1)**
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; }
Đ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)**
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; }
Đ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)**
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; }
Đ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)**
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; }
Ở 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](https://duythanhcse.wordpress.com/2018/05/30/bai-7-cac-ky-thuat-filter-du-lieu-trong-mongodb-voi-c/). **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)**
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; }
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:
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; }
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 ](https://duythanhcse.wordpress.com/2018/06/03/bai-9-ky-thuat-sap-xep-du-lieu-mongodb-bang-c/mongodb68/) **Sting**và **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();
private void btnExit_Click(object sender, RoutedEventArgs e) { Close(); }
Dưới đây là tổng hợp XAML và Coding đầy đủ:
**MainWindow.xaml:**
Coding đầy đủ:
**MainWindow.xaml.cs:**
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; } } }
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](http://www.mediafire.com/file/cc50fda9a4s0mkq/SortMongoDBCSharp.rar/file)
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:
[http://communityuni.com/](http://communityuni.com/)
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](https://duythanhcse.wordpress.com/2018/05/31/bai-8-ky-thuat-binding-du-lieu-mongodb-len-listview-wpf/)
Ở
[bài 7](https://duythanhcse.wordpress.com/2018/05/30/bai-7-cac-ky-thuat-filter-du-lieu-trong-mongodb-voi-c/) 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:
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](https://duythanhcse.wordpress.com/2018/05/28/bai-4-driver-net-cho-mongodb-va-cach-tham-chieu-trong-c/), 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](https://duythanhcse.wordpress.com/2018/05/27/bai-3-cach-su-dung-mongodb-compass/)):
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; } } }
**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**):
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:**
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; } } }
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](http://www.mediafire.com/file/m3mg9c4eetqq4u4/BindingMongoDBCSharp.rar/file)
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:
[http://communityuni.com/](http://communityuni.com/)
Chúc các bạn thành công!

X-nananana: Batcache

Cache-Control: max-age=300, must-revalidate

Vary: Cookie

X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.

Link: <https://wp.me/1CBDR>; rel=shortlink

X-ac: 1.dca _dca


markdown:
Dành cho khách hàng: Để mua sản phẩm bạn vui lòng liên hệ theo số điện thoại trong tin
đăng của các shop.
Dành cho chủ shop:

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Server: Zamba VCCorp

Access-Control-Allow-Methods: GET, POST, PUT

Connection: close

Pragma: no-cache

Cache-Control: max-age=0, no-cache, no-store

Access-Control-Allow-Credentials: true

Set-Cookie: old_city=0; expires=Wed, 20-Jun-2018 14:00:06 GMT; path=/; domain=.enbac.com

Content-Type: text/html


Set-Cookie: old_city=0; expires=Wed, 20-Jun-2018 14:10:09 GMT; path=/; domain=.enbac.com


markdown:
# Giày đế xuồng EVA121018Mã SP: [[sku]]
[Liên hệ mua hàng](/pages/lien-he) *Cháy hàng*
Còn
**1** sản phẩm
##### SẼ CÓ TẠI NHÀ BẠNtừ 1-5 ngày làm việc
###
[CHI TIẾT SẢN PHẨM]
** thiết kế điển hình cho bạn gái văn phòng, kiểu dáng thanh lịch tinh tế đúng chất công sở,gót chắc chắn cùng độ cao gót vừa phải luôn tạo sự thoải mái chắc chắn, màu sắc dễ phối đồ đặc biệt với các trang phục công sở. Giày công sở**
|
|Sản phẩm: |Giày công sở|
|
|Chất liệu: |Da tổng hợp|
|
|Độ cao: |3cm|
|
|Màu sắc: |Đen, be, đỏ.|
|
|Kích cỡ: |Từ 35 - 39|
|
|Phối đồ: |Đầm, váy ngắn, quần kaki, trang phục công ở .v.v.|
**- Khử mùi bên trong giày**
Mang giày suốt cả ngày dài đôi khi sẽ bị mồ hôi chân gây ẩm ướt, mùi hôi. Bạn hãy đặt túi đựng viên chống ẩm vào bên trong giày để hút ẩm và rắc phấn rôm (có thể thay bằng cách đặt vào bên trong giày gói trà túi lọc chưa qua sử dụng) để khử mùi, giúp giày luôn khô thoáng.
Để hạn chế mùi hôi và sự ẩm ướt cho giày, hãy chọn vớ chân loại tốt, có khả năng thấm hút cao. Ngoài ra, dùng các loại lót giày khử mùi cũng là một phương pháp tốt.
**- Làm mềm giày da**
Giày da để quá lâu không được sử dụng, đôi khi sẽ bị co cứng lại, dễ gây cảm giác đau chân khi dùng. Để làm mềm giày, đối với giày da, si, bạn có thể thoa một lớp vaseline lên giày, để một vài tiếng, giày sẽ mềm trở lại. Đối với các loại giày da lộn, bạn có thể dùng vải mềm ẩm lau qua toàn bộ giày, để qua đêm, da giày sẽ mềm hơn hẳn.
Để da giày được bền lâu, bạn nhớ hạn chế làm ướt giày. Khi giày bị ướt, không nên hơ bằng lửa, phơi nắng hoặc dùng máy sấy nóng, sẽ làm giày bị cứng, co lại hoặc hỏng bề mặt da. Hãy dùng giấy khô vò lại đặt vào trong giày để hút ẩm, phơi giày ở nơi râm mát. Sau khi khô, với giày da thì nên thoa vaseline, đánh si để da mềm và bóng đẹp trở lại.
**- Bảo quản giày khi không sử dụng**
Khi bạn mua giày tại Evashoes, giày sẽ được đặt trong một hộp giày kèm với túi chống ẩm. Khi sử dụng giày, bạn đừng vội vứt hộp đi mà hãy cất lại để dành. Khi không sử dụng, hãy nhét một ít giấy vụn vào bên trong giày để giữ cho dáng giày luôn chuẩn, đẹp. Sau đó đặt giày vào hộp bảo quản cùng túi hút ẩm.
Khi cần mang ra sử dụng, hãy áp dụng những cách làm mềm giày da bên trên, như vậy đôi giày của bạn sẽ luôn bền đẹp như mới.
**Evashoes sẽ thực hiện việc đổi/trả hàng và hoàn tiền cho khách hàng trong những trường hợp sau.** **Sản phẩm Evashoes giao không đúng đơn đặt hàng**
Bạn nghĩ rằng sản phẩm giao cho bạn không đúng với đơn đặt hàng? Hãy liên hệ với chúng tôi càng sớm càng tốt, hệ thống của chúng tôi sẽ kiểm tra nếu hàng của bạn bị gửi nhầm. Trong trường hợp đó, chúng tôi sẽ thay thế đúng mặt hàng bạn yêu cầu (khi có hàng).
**Sản phẩm mua rồi nhưng không ưng ý**
Người mua có thể trả hàng khi không vừa ý trong vòng 7 ngày kể từ ngày nhận hàng, Evashoes sẽ đổi sản phẩm cho khách. Sản phẩm muốn đổi hoặc trả yêu cầu phải là sản phẩm không có dấu hiệu đã qua sử dụng và còn nguyên tem, mác, nguyên đai kiện ban đầu
**Sản phẩm mua bị lỗi**
Quý khách vui lòng kiểm tra sản phẩm trước khi thanh toán. Trong trường hợp sản phẩm bị hư hại trong quá trình vận chuyển, quý khách vui lòng từ chối và gửi lại sản phẩm cho Evashoes. Đồng thời thông báo cho Trung tâm hỗ trợ khách hàng 1900 56 56 83, Evashoes sẽ gửi cho quý khách mặt hàng thay thế.
**Điều kiện đổi trả hàng** *Điều kiện về thời gian đổi trả*: trong vòng 7 ngày kể từ khi nhận được hàng. *Điều kiện về sản phẩm*:
- Hàng hóa còn đầy đủ các bộ phận, không có dấu hiệu sử dụng quá nhiều hoặc hỏng hóc.
- Khách hàng chịu chi phí vận chuyển cho việc đổi, trả hàng.
- Trường hợp không đủ các điều kiện trên thì quyền quyết định đổi, trả hàng thuộc về Evashoes
**Địa chỉ nhận bảo hành và đổi sảm phẩm**
- Tên công ty: Công ty Cổ phần Quốc tế VIT- nhãn hàng Evashoes
- Địa chỉ:
**26 Nguyễn Phong Sắc – Cầu Giấy- Hà Nội.**
- Điệnthoại: 1900 56 56 83
- Email:
[Info@evashoes.com.vn](mailto:Info@evashoes.com.vn)

WARC-Identified-Payload-Type: text/html

X-Cache: miss

Server: nginx

X-Content-Type-Options: nosniff

P3P: CP="NOI DSP COR NID ADMa OPTa OUR NOR"

X-Page: product-detail

Cache-Control: private

Vary: Accept-Encoding

Set-Cookie: _orig_referrer=; expires=Wed, 04-Jul-2018 14:40:03 GMT; path=/; HttpOnly

X-XSS-Protection: 1; mode=block

Content-Type: text/html; charset=utf-8


markdown:
Bạn đang thực hiện mua Tài khoản Getlink Pro M1 (Băng thông: 10GB - Thời gian sử dụng: 30 ngày)
Số tiền cần thanh toán qua hệ thống Bảo Kim là: 29 000 đ
**Lưu ý:**
- Hệ thống sẽ tự động gửi tài khoản trong 15 phút sau khi giao dịch được Baokim xử lý thành công.
-
**Sau khi thanh toán xong, bạn vui lòng KHÔNG ĐÓNG TRÌNH DUYỆT để nhận tài khoản nhanh nhất**

Content-Type: text/html; charset=UTF-8


markdown:
Sở hữu những ưu điểm tốt nhất từ những căn hộ khác trong khu vực,
[căn hộ vinhomes golden river](http://vinhomes-goldenriver.info/) quận 1 thể hiện đẳng cấp của riêng mình. Dưới sự quản lý và phát triển của chủ đầu tư vinhomes golden river được xem là nơi ở lý tưởng nhất trong khu vực với đầy đủ tiện nghi. Mang lại một không gian sống sang trọng của cư dân góp phần phát triển xã hội ngày càng văn minh hiện đại hơn. Căn hộ được bố trí nằm ven sông sài gòn là nơi thoáng mát thơ mộng dành cho cư dân sinh sống với không gian tuyệt vời nhất. **Căn hộ Vinhomes Golden River** giống như một thành phố hiện đại thủ nhỏ, chứa đầy đủ với các tiện ích đẳng cấp, sang trọng chỉ dành riêng cho giới nhà giàu. Sở hữu một địa thế hết sức thuận lợi trong khu vực Ba Son, Tân Cảng, nơi đây thuộc phân khu 3 theo quy hoạch trung tâm TP. Hồ Chí Minh mới – nơi sẽ tập trung phát triển các tòa nhà cao ốc văn phòng, khu đô thị mới và những con đường ven sông tuyệt vời.
Bên cạnh đó căn hộ
**vinhomes golden river quận 1** được trang bị đầy đủ tiện ích với những khu vui chơi thư giãn cao cấp, những trung tâm thương mại lớn nhất trong khu vực. Đồng thời bạn có thể di chuyển đến các trung tâm khác trong thành phố chỉ mất vài phút. Bạn không còn lo lắng nơi ở cũng như tiện ích để phục vụ nhu cầu sinh sống của mình để an cư lạc nghiệp và phát triển kinh tế. Sở hữu **căn hộ vinhomes golden river** quận 1 đã khẳng định nền kinh tế của bản thân với gia đình và bạn bè. Đây là nơi tốt nhất để bạn hoàn thiện những ước mơ tuyệt vời nhất của bạn, hoặc cũng là cơ hội để đầu tư sinh lời. [hcmweb.net](https://hcmweb.net)

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Set-Cookie: PHPSESSID=156japgrgv7dv8rnhefgpkuce6; path=/; secure; HttpOnly

Vary: Accept-Encoding,User-Agent

Link: <https://hcmweb.net/wp-json/>; rel="https://api.w.org/", <https://hcmweb.net/?p=730>; rel=shortlink