增刪改查資料庫
接下去我們就可以通過Driver讀寫資料庫了。
在擷取資料之前,我們需要擷取對應類映射的Collection:DbHelper.db.GetCollection<T>(name); // name表示T映射的Collection名稱
GetCollection這個方法必須指定name參數。其實這裡我覺得之前在映射的時候應該已經確定了T對應的Collection的名稱,為什麼這裡的name必須要指定呢?還是說有其他方法我不知道的?
MongoDB的讀資料是Find命令。在Driver中也都是Find/FindAll方法。
GetCollection<T>().FindAll();
在實際應用在,我們一般都是會有查詢條件,以及排序條件的。
MongoDB的查詢條件是IMongoQuery,排序條件是IMongoSortBy。
GetCollection<T>().Find(query).SetSortOrder(sortBy);
同時你也可以利用SetSkip和SetLimit來進行分頁:
GetCollection<T>().Find(query).SetSortOrder(sortBy).SetSkip(skip).SetLimit(limit);
下面的是我根據標籤擷取對應資料的方法,根據更新時間排序,還沒有處理分頁的功能:
///<summary>
/// 擷取標籤對應的資料
///</summary>
///<param name="ht"></param>
///<returns></returns>
public static List<HouseInfo> Find(HouseTag ht)
{
QueryComplete query = null;
if (ht != null)
{
query = Query.And(
Query.GTE(HouseTag.PNameArea, ht.AreaMin),
Query.LTE(HouseTag.PNameArea, ht.AreaMax),
Query.GTE(HouseTag.PNamePrice, ht.PriceMin),
Query.LTE(HouseTag.PNamePrice, ht.PriceMax),
Query.GTE(HouseTag.PNamePriceTotal, ht.PriceTotalMin),
Query.LTE(HouseTag.PNamePriceTotal, ht.PriceTotalMax),
Query.GTE(HouseTag.PNameYear, ht.YearMin),
Query.LTE(HouseTag.PNameYear, ht.YearMax)
);
if (!string.IsNullOrEmpty(ht.Zone))
{
MongoDB.Bson.BsonRegularExpression reg = new MongoDB.Bson.BsonRegularExpression(string.Format("*{0}*", ht.Zone));
query = Query.And(query, Query.Matches(HouseTag.PNameZone, reg));
}
}
return MongoHelper.FindAll<HouseInfo>(query, SortBy.Descending("UpdateTime")).ToList();
}
擷取了資料之後,接下去就是儲存資料了,儲存(新增和修改)資料相對簡單一點,直接用Save就好了,而且,我這裡也沒有處理變化的資料,每次儲存都是整個對象進行了更新(就效率而言,肯定不合適,但就編程而言,那是方便不只一點點啊):
///<summary>
/// 更新資料集合
///</summary>
///<typeparam name="T"></typeparam>
///<param name="listEntity"></param>
public static void Save<T>(IEnumerable<IMongoEntity> listEntity)
where T : class, IMongoEntity
{
if (listEntity != null)
{
MongoCollection<T> col = GetCollection<T>();
foreach (IMongoEntity entity in listEntity)
{
col.Save(entity);
}
}
}
刪除資料相對更新有個差別是需要根據對應擷取條件(IMongoQuery):
///<summary>
// 刪除資料集合
///</summary>
///<typeparam name="T"></typeparam>
///<param name="listEntity"></param>
public static void Remove<T>(IEnumerable<IMongoEntity> listEntity)
where T : class, IMongoEntity
{
if (listEntity != null)
{
MongoCollection<T> col = GetCollection<T>();
foreach (IMongoEntity entity in listEntity)
{
col.Remove(Query.EQ("ID", entity.ID));
}
}
}