您的位置:首页 > 博客中心 > 数据库 >

MongoDB使用总结(C#版)

时间:2022-03-14 13:58

简介

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.一个表可以存多种类型的数据,但是最好不要这样,读取的时候很麻烦,拆箱装箱极易错,还是一个表一种类型为好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

本类排行

今日推荐

热门手游