用 MongoDB 開發程式也面臨到許多難題,雖然mongo是適用物件儲存時非常具有彈性,但也有它的缺點,例如型別檢查是非常不嚴格的,如果資料欄位型態儲存失敗,也不會有任何的提示訊息,需要特別注意,因為MongoDB不支援某些SQL的型別,所以要先轉換型別,所以在LINQ上需要轉換型別時,可以參考以下的範例
var
oders = (from
b in
realTimeDb.v_orderinfo4back
select
new
{
CREATEDDATE
= b.CREATEDDATE,
COLORNAME
= b.colorname,
COST
= b.COST,
deliverytypename
= b.deliverytypename,
ITEMID
= b.ITEMID,
}).AsEnumerable().Select(q=>
new
vOrderInfo4Back()
{
CREATEDDATE
= q.CREATEDDATE,
COLORNAME
= q.COLORNAME,
COST
= Convert.ToDouble(q.COST),
DELIVERYTYPENAME
=q.deliverytypename,
ITEMID
= Convert.ToDouble(q.ITEMID),
}); |
注意:
在SQL有Deciaml型別,但mongodb
並沒有deciaml會被轉換成string,所以mongodb在型態檢查是不嚴格
建立mongoDB的索引
//-----add
index------//
var
keyCreateDates =
MongoDB.Driver.Builders<vOrderInfo4Back>.IndexKeys.Ascending("CREATEDDATE");
_db.vOrderInfo4Back.Indexes.CreateOne(keyCreateDates);
var
keyOrderid =
MongoDB.Driver.Builders<vOrderInfo4Back>.IndexKeys.Ascending("ORDERID");
_db.vOrderInfo4Back.Indexes.CreateOne(keyOrderid);
var
keySALENO =
MongoDB.Driver.Builders<vOrderInfo4Back>.IndexKeys.Ascending("SALENO");
_db.vOrderInfo4Back.Indexes.CreateOne(keySALENO);
|
注意:
MongoDB 會自動新增Collection
【如同SQL的資料表】,並不需要事先開table
儲存資料,所以如果要在程式中建立索引亦可以加快搜尋速度。
建立mongoDB的儲存模型
public
class
vOrderInfo4Back
{
///
<summary>
///
訂單日期
///
</summary>
public
DateTime?
CREATEDDATE { get;
set;
}
///
<summary>
///
訂單編號
///
</summary>
public
double
ORDERID { get;
set;
}
///
<summary>
///
項次
///
</summary>
public
double
ITEMID { get;
set;
}
///
<summary>
///
顏色
///
</summary>
public
string
COLORNAME { get;
set;
}
///
<summary>
///
成本
///
</summary>
public
double?
COST { get;
set;
}
///
<summary>
///
配送方式
///
</summary>
public
string
DELIVERYTYPENAME { get;
set;
}
} |
因為MongoDB十分有彈性,只有在儲存的model
增加欄位,儲存至mongoDB會自動增加欄位,並不用特別針對資料庫增加欄位,這點是NO
SQL 的好處之一,只需著重程式開發上是否會影響之前的程式。
因為MongoDB
讀取時間會依預設的標準時間為主(US),所以要加上BsonDateTimeOptions
關鍵字
或者 註明當地時間
[BsonDateTimeOptions(kind=dateTimekind.Local)]
///
<summary>
///
訂單日期
///
</summary>
[BsonDateTimeOptions]
public
DateTime
CREATEDDATE { get;
set;
}
|
注意:如果要讀取MongoDB日期欄位,需要加註
[BsonDateTimeOptions]在欄位的上方
單筆寫入MongoDB的範例:
var
_db = new
MallDbContext();
//是自己新增的物件,用來取得MongoDB的資料庫
_db.vOrderInfo4Back.InsertOne(new
vOrderInfo4Back()
{
COLORNAME
= "",
COST=0,
ITEMID=1,
SALENO=1,
DELIVERYTYPENAME="測試"
}); |
_db.vOrderInfo4Back
:
自己新增的物件回傳vorderInfo4Back的collection
如果有多筆資料要一次寫入MongoDB時,需要用InsertMany
可以加快mongo寫入的速度
_db.vOrderInfo4Back.InsertMany(orderList);
|
查詢Mono的LINQ語法
var
_db = new
MallDbContext();
var
vOrders=
_db.GetCollection<vOrderInfo4Back>("vOrderInfo4Back").AsQueryable<vOrderInfo4Back>();
//支援LINEQ語法
var
orders = from
q in
vOrders where
(string.IsNullOrEmpty(inputModel.productName)
|| q.SALENAME.Contains(inputModel.productName ?? ""))
&&
q.CREATEDDATE >= startDate
&&
q.CREATEDDATE <= endDate
&&
q.SUPPLIERID == doubleFugoID
orderby
q.CREATEDDATE descending
select
q;
|
C#查詢Mongo原生語法
var
builder = Builders<vOrderInfo4Back>.Filter;
var
filter = builder.Gte(q
=> q.CREATEDDATE, startDate) & builder.Lte(q
=> q.CREATEDDATE, endDate)
//GTE 如同>=,LTE
如同<=
//商品名稱
(LIKE
'% productName%' )
if
(!string.IsNullOrWhiteSpace(inputModel.productName))
{
filter
= filter & builder.Regex(q => q.SALENAME, "/.*"
+ inputModel.productName + ".*/");
}
//
supplier
if
(!string.IsNullOrWhiteSpace(fugoID))
{
filter
= filter & builder.Eq(q
=> q.SUPPLIERID, doubleFUgoID);
}
//前台分類
if
(categories2.Count > 0)
{
filter
= filter & builder.In(q
=> q.SCLASSCODE, categories2);
}
var
vOrders =
_db.GetCollection<vOrderInfo4Back>("vOrderInfo4Back").Find(filter) |
以上是我對MongoDB的基本瞭解,如果有任何補充的地方,還希望大家多多指教~
感謝大家
沒有留言:
張貼留言