mongodb 查询的用法

时间:2021-08-26 01:24:01

想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动。C#版的驱动貌似有很多种,如官方提供的samus。 实现思路大都类似。这里我们用官方提供的mongo-csharp-driver :

下载地址:http://github.com/mongodb/mongo-csharp-driver/downloads

解压之后得到两个dll:

MongoDB.Driver.dll:顾名思义,驱动程序

MongoDB.Bson.dll:序列化、Json相关

然后在我们的程序中引用这两个dll。

2、连接数据库

  1. using MongoDB.Bson;
  2. using MongoDB.Driver;
  1. //数据库连接字符串
  2. const string strconn = "mongodb://127.0.0.1:27017";
  3. //数据库名称
  4. const string dbName = "test";
  5. MongoServer server;
  6. MongoDatabase db;
  7. void Init()
  8. {
  9. //创建数据库链接
  10. server = MongoDB.Driver.MongoServer.Create(strconn);
  11. //获得数据库
  12. db = server.GetDatabase(dbName);
  13. }

3、查询数据

1)查询规则集合

  1. class Users
  2. {
  3. public ObjectId _id;//BsonType.ObjectId 这个对应了 MongoDB.Bson.ObjectId
  4. public string Name { get; set; }
  5. public string Sex { set; get; }
  6. }
  7. const string ENTER = "\r\n";
  8. private void btnQuery_Click(object sender, EventArgs e)
  9. {
  10. //获取Users集合
  11. MongoCollection col = db.GetCollection("Users");
  12. //查询全部集合里的数据
  13. var result1 = col.FindAllAs<Users>().ToList();
  14. StringBuilder sb = new StringBuilder("");
  15. foreach (Users user in (List<Users>)result1)
  16. {
  17. sb.Append(user.Name + ENTER);
  18. }
  19. MessageBox.Show(sb.ToString());
  20. }

这种方式只适合每个文档(document)结构都一样的集合:

mongodb 查询的用法

但是NoSql诟病关系型数据库的论点之一,就是这种所谓每条记录的结构都要保持一致的情况,因为有些字段不是所有记录的必须。那么,在mongoDB这里,对于集合中文档结构不一致的情况下,上述代码获取不到数据,似乎应该采用如下方式:

2)查询不规则集合

集合情况:

mongodb 查询的用法

在集合thins里,基本上每个文档结构都不一样。

查找代码如下:

    1. private void btnQuery2_Click(object sender, EventArgs e)
    2. {
    3. //获取thins集合
    4. MongoCollection col = db.GetCollection("thins");
    5. //查询全部集合里的数据
    6. var result1 = col.FindAllAs<BsonDocument>().ToList();
    7. StringBuilder sb = new StringBuilder("");
    8. foreach (BsonDocument bd in (List<BsonDocument>)result1)
    9. {
    10. string name = bd.Contains("name") ? bd.GetValue("name").ToString() : "不存在";
    11. sb.Append(name + ENTER);
    12. }
    13. MessageBox.Show(sb.ToString());
    14. }