1. 程式人生 > >MongoDB使用總結(C#版 潘鵬)

MongoDB使用總結(C#版 潘鵬)

簡介

MongoDB是非關係型、文件型的資料庫,方便之處在於可以直接存取class型別……官網定期會開設Free的課程,上一個專案中使用到MongoDB,現在我做的專案用的是EF,所以想將MongoDB用過的方法、注意的事項和一些想法總結一下,畢竟,如果再次使用的話林林總總去拼湊還是要浪費時間的。

DLL

(1) MongoDB.Bson.dll
(2) MongoDB.Driver.dll

軟體

很好的視覺化軟體,MongoVUE

方法

連線

//Mongo資料庫名稱
private MongoDatabase Mg_db;
//Mongo資料庫集合名稱
public MongoCollection Mg_col; //MongoServer private MongoServer mongoServer; //連線字串(以mongodb://開頭) string connectionString = "mongodb://localhost";//或者是192.xxx.xxx.xxx //string constr = "mongodb://" + ip + ":" + port; //連線ip和該port //連線Mongo資料庫 var client = new MongoClient(connectionString); //得到一個客戶端引用 mongoServer = client.GetServer();

建立資料庫

Mg_db = mongoServer.GetDatabase(dbName);
//dbName是新庫的名字
//如果已有dbName這個庫,那Mg_db是get這個庫,否則就是建立

建立表(集合)

Mg_col = Mg_db.GetCollection<T>(connectionName);
//connectionName是新表的名字
//如果該庫已有connectionName這個表,那Mg_col 是get這個表,否則就是建立

在表中插入資料

public void Insert<T>(string dbName, string
connectionName, T t) { Mg_db = mongoServer.GetDatabase(dbName); //get 某個庫 MongoCollection collection = Mg_db.GetCollection<T>(connectionName); //get該庫某個表 collection.Insert(t); //插入(任意型別) }

在表中刪除資料

public void delete<T>(string dbName, string connectionName, string key, BsonValue value)
{
    Mg_db = mongoServer.GetDatabase(dbName);
    Mg_col = Mg_db.GetCollection<T>(connectionName);

    var query = Query.EQ(key, value);
    //查詢條件,eg:我要刪除name是張三的該條資料,key,欄位名,value是張三
    Mg_col.Remove(query);
}

更新表中的某一條資料

public void UpData(string dbName, string connectionName, string key, BsonValue value, People t)
{
      Mg_db = mongoServer.GetDatabase(dbName);
      Mg_col = Mg_db.GetCollection(connectionName);

      var query = Query.EQ(key, value);
      People temp = Mg_col.FindOneAs<People>(query);
      //根據查詢條件獲取表中People型別的資料temp,這也是我們要更新的資料
      t.id = (temp as People).id;
      //t是People型別的一條新資料,它拿到要更新資料的id

      Mg_col.Update(query, Update.Replace(t));
}

查詢某個表符合條件的物件並返回

public T Find<T>(string dbName, string connectionName, string key, BsonValue value)
 {
     Mg_db = mongoServer.GetDatabase(dbName);
     MongoCollection collection = Mg_db.GetCollection<T>(connectionName);
     var query = Query.EQ(key, value);

     T result = collection.FindOneAs<T>(query);

     return result;
 }

查詢某個表符合條件的物件個數

public long FindSameNameCollectionNum(string dbName, string collcetionName, string key, BsonValue value)
{
    Mg_db = mongoServer.GetDatabase(dbName);
    Mg_col = Mg_db.GetCollection(collcetionName);
    var query = Query.EQ(key, value);
    long count = Mg_col.Count(query);
    return count;
}

獲取某個表中的所有物件

public List<T> GetProjectArray<T>(string dbName, string connectionName)
 {
     Mg_db = mongoServer.GetDatabase(dbName);
     Mg_col = Mg_db.GetCollection(connectionName);

     //獲取該集合所有物件
     var result = Mg_col.FindAllAs<T>();
     List<T> pList = new List<T>();
     pList.AddRange(result);
     return pList;
 }

儲存影音文字資料放在GridFS

MongoDB中每個庫對應一個GridFS資料夾用來存放影音文字……
可以在這裡用程式新增
可以直接在MongoVUE中新增

public void AddFileInGridFS(string dbName, string filePath)
{
     Mg_db = mongoServer.GetDatabase(dbName);
     MongoGridFS gridfs = Mg_db.GridFS;
     gridfs.Upload(filePath);
}

取出放在GridFS中的資料

public void LoadFileInGridFS(string dbName, string fileName)
{
    Mg_db = mongoServer.GetDatabase(dbName);
    MongoGridFS gridfs = Mg_db.GridFS;
    gridfs.Download(fileName);
}

取出放在GridFS中的資料儲存在Byte[]中

public byte[] ReadFileFromfs(string dbName, string fileName, byte[] bytes)
{
    Mg_db = mongoServer.GetDatabase(dbName);
    MongoGridFS gridfs = Mg_db.GridFS;
    MongoGridFSStream gridFileStream = gridfs.OpenRead(fileName);
    bytes = new byte[gridFileStream.Length];
    gridFileStream.Read(bytes, 0, bytes.Length);
    return bytes;
}

注意事項

1.庫名不可以是中文,會報錯。
2.private的資料無法存入MongoDB中。
3.要存入的class,結構中新增using MongoDB.Bson;並新增 public ObjectId id { get; set; },這個id存入後自增長。

體會

1.MongoDB的結構庫—-集合—-物件,這裡的集合就是表,但是我說的是”集合“,以至於上面的方法中我定義的都是collection,同樣的,我強調的還有物件這個概念
2.一個表可以存多種型別的資料,但是最好不要這樣,讀取的時候很麻煩,拆箱裝箱極易錯,還是一個表一種型別為好。