C#中操作MongoDB

C#中在mongodb插入记录

如何在C#中往mongodb中插入记录:

static void Main(string[] args)
{
    IMongoCollection<Book> collection = db.GetCollection<Book>("books");
    var all = collection.Find(m => true).ToList();
    //插入
    collection.InsertOne(new Book() { title = "爱因斯坦" });
    collection.InsertOne(new Book() { title = "物理学" });
    var all2 = collection.Find(m => true).ToList();
    Console.ReadKey();
}Code language: JavaScript (javascript)

补充说明

  • InsertOne() 插入单条文档,InsertMany() 插入多条文档
  • 不指定 _id 时,MongoDB 驱动会自动生成 ObjectId 赋值给 _id 字段
  • 插入后可以通过再次 Find() 查询验证结果

C#中在mongodb修改记录

static void Main(string[] args)
{
    IMongoCollection<Book> collection = db.GetCollection<Book>("books");
    var one = collection.Find(m=>m._id==new 
ObjectId("5e6dec305ca09501dc5584cc")).First();
    FilterDefinition<Book> filter = "{ _id: ObjectId(\"5e6dec305ca09501dc5584cc\")}";
    UpdateDefinition<Book> update = "{ $set: { title: '你好吗 哈哈 新文字' } }";
    collection.UpdateOne(filter, update);
    var one2 = collection.Find(m => m._id == new
ObjectId("5e6dec305ca09501dc5584cc")).First();
    Console.ReadKey();
}Code language: JavaScript (javascript)

需要用到 FilterDefinition 和 UpdateDefinition。

具体可以参考官方文档:

http://mongodb.github.io/mongo-csharp-driver/2.10/reference/driver/definitions/

补充说明

  • UpdateOne() 只更新第一条匹配文档,UpdateMany() 更新所有匹配文档
  • filter 定义查询条件,update 定义要修改的字段和操作符
  • 除了 JSON 字符串写法,也可以用构建器方式:
var filter = Builders<Book>.Filter.Eq("_id", new ObjectId("5e6dec305ca09501dc5584cc"));
var update = Builders<Book>.Update.Set("title", "你好吗 哈哈 新文字");
collection.UpdateOne(filter, update);Code language: JavaScript (javascript)
  • 如果要用强类型字段名,可以定义:
UpdateDefinition<Book> update = Builders<Book>.Update.Set(b => b.title, "新标题");Code language: JavaScript (javascript)

C#中在mongodb删除记录

static void Main(string[] args)
{
    IMongoCollection<Book> collection = db.GetCollection<Book>("books");
    var one = collection.Find(m=>m._id==new 
ObjectId("5e6dec305ca09501dc5584cc")).First();
    FilterDefinition<Book> filter = "{ _id: ObjectId(\"5e6dec305ca09501dc5584cc\")}";
    collection.DeleteOne(filter);
    var one2 = collection.Find(m => m._id == new
ObjectId("5e6dec305ca09501dc5584cc")).FirstOrDefault();
    Console.ReadKey();
}Code language: JavaScript (javascript)

删除操作只需要传入 FilterDefinition,在里面使用 JSON 格式的条件。

补充说明

  • DeleteOne() 删除第一条匹配文档,DeleteMany() 删除所有匹配文档
  • 删除后再查询,匹配不到时 FirstOrDefault() 返回 null,不会抛异常
  • 也可以用构建器写条件:
var filter = Builders<Book>.Filter.Eq("_id", new ObjectId("5e6dec305ca09501dc5584cc"));
collection.DeleteOne(filter);Code language: JavaScript (javascript)

C#中在mongodb查找记录

可以按条件查询,如果条件给 true 就是查询所有。

static void Main(string[] args)
{
    IMongoCollection<Book> collection = db.GetCollection<Book>("books");
    var one = collection.Find(m => m._id == new
ObjectId("5e6dec305ca09501dc5584cc")).FirstOrDefault();
    var list = collection.Find(m => m.title.Contains("d") && m.title.Length > 3);
    Console.ReadKey();
}Code language: JavaScript (javascript)

更多查询示例:

IMongoCollection<Book> collection = db.GetCollection<Book>("books");

var one = collection.Find(m => m._id == new
ObjectId("5e6dedf3907d2e3954269152")||m.title.Contains("dd")).FirstOrDefault();

var list = collection.Find(m => m._id == new
ObjectId("5e6dedf3907d2e3954269152")).ToList();

var list2 = collection.Find(m => m._id == new
ObjectId("5e6dedf3907d2e3954269152")&&m.title.Length>3||m.title.Contains("1")).ToList();

var all = collection.Find(m => true).ToList();Code language: JavaScript (javascript)

补充说明

  • Find() 返回的是 IFindFluent,可以链式调用 Sort()、Limit()、Skip():
var list = collection.Find(m => true).SortBy(b => b.title).Skip(0).Limit(10).ToList();Code language: JavaScript (javascript)
  • First() 查不到会抛异常,FirstOrDefault() 查不到返回 null
  • Lambda 表达式中的条件会被驱动翻译成 MongoDB 查询语法,支持大部分常用操作
  • Contains() 翻译成正则表达式匹配,等价于 { title: /d/ }
  • Length 属性翻译成 $strLenCP 操作符,注意不是所有字符串操作都能直接翻译,复杂条件可以用 FilterDefinition 的 JSON 写法

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注