C#访问MongoDB简明教程(2) CRUD操作

524 阅读11分钟

2. CRUD操作

2.1 插入文档

新建项目,项目名称是Demo02-Insert,安装.NET驱动Nuget包。新建Employee类,用于对应数据库EmployeeDB所属集合Employees的文档,ObjectId定义在MongoDB.Bson名字空间下面,需要在源文档开头引用该名字空间,.NET类型ObjectId对应MongoDB的Object ID数据类型,用于创建文档的ID。

using MongoDB.Bson;

namespace Demo02_Insert
{
    public class Employee
    {
        public ObjectId Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
        public string ZipCode { get; set; }
    }
}

新建EmployeeContext类,用于管理连接MongoDB本地实例,给数据库每个集合提供一个对应的共有属性,通过该属性来操作对应的数据库集合。这里提供的Employees共有属性,用来操作数据库的Employees集合。

using MongoDB.Driver;

namespace Demo02_Insert
{
    public class EmployeeContext
    {
        public IMongoDatabase Database;

        public EmployeeContext()
        {
            string connectionString = @"mongodb://127.0.0.1";
            MongoClient client = new MongoClient(connectionString);

            string databaseName = "EmployeeDB";
            Database = client.GetDatabase(databaseName);
        }

        public IMongoCollection<Employee> Employees
        {
            get
            {
                return Database.GetCollection<Employee>("Employees");
            }
        }
    }
}

TestInsertOne静态方法在Employees集合里面插入1个文档,TestInsertMany静态方法在Employees集合里面插入3个文档,分别在Main方法里面调用。IMongoCollection接口提供了InsertOne方法和InsertMany方法,InsertOne用于集合里面插入1个文档, InsertMany方法用于在集合里面插入多个文档。

using System.Collections.Generic;

namespace Demo02_Insert
{
    class Program
    {
        static void Main(string[] args)
        {
            //TestInsertOne();
            //TestInsertMany();
        }

        static void TestInsertOne()
        {
            Employee employee = new Employee
            {
                Name = "李四",
                Age = 32,
                Gender = "女",
                ZipCode = "100235"
            };

            EmployeeContext context = new EmployeeContext();
            context.Employees.InsertOne(employee);
        }

        static void TestInsertMany()
        {
            List<Employee> employeeList = new List<Employee>()
            {
                new Employee
                {
                    Name = "王五",
                    Age = 30,
                    Gender = "女",
                    ZipCode = "100315"
                },
                new Employee
                {
                    Name = "赵六",
                    Age = 31,
                    Gender = "男",
                    ZipCode = "100315"
                },
                new Employee
                {
                    Name = "钱七",
                    Age = 36,
                    Gender = "女",
                    ZipCode = "100236"
                }
            };
            
            EmployeeContext context = new EmployeeContext();
            context.Employees.InsertMany(employeeList);
        }
    }
}

2.1 查询文档

新建项目,项目名称是Demo03-Read,Employee类、EmployeeContext类和Demo02-Insert相同。IMongoCollection接口提供了AsQuerable方法,返回IMongoQueryable的对象, IMongoQueryable接口继承自IQueryable,只要引用名字空间System.Linq,可以很方便的使用IQueryable的扩展方法来查询集合。

using System.Collections;
using System.Collections.Generic;
using System.Linq.Expressions;

namespace System.Linq
{
    public static class Queryable
    {
        public static TResult Aggregate<TSource, TAccumulate, TResult>(this IQueryable<TSource> source, TAccumulate seed, Expression<Func<TAccumulate, TSource, TAccumulate>> func, Expression<Func<TAccumulate, TResult>> selector);
        public static TSource Aggregate<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, TSource, TSource>> func);
        public static TAccumulate Aggregate<TSource, TAccumulate>(this IQueryable<TSource> source, TAccumulate seed, Expression<Func<TAccumulate, TSource, TAccumulate>> func);
        public static bool All<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static bool Any<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static bool Any<TSource>(this IQueryable<TSource> source);
        public static IQueryable<TElement> AsQueryable<TElement>(this IEnumerable<TElement> source);
        public static IQueryable AsQueryable(this IEnumerable source);
        public static double Average(this IQueryable<double> source);
        public static double Average(this IQueryable<int> source);
        public static double? Average(this IQueryable<int?> source);
        public static double Average(this IQueryable<long> source);
        public static double? Average(this IQueryable<long?> source);
        public static float Average(this IQueryable<float> source);
        public static float? Average(this IQueryable<float?> source);
        public static double? Average(this IQueryable<double?> source);
        public static decimal Average(this IQueryable<decimal> source);
        public static decimal? Average(this IQueryable<decimal?> source);
        public static double Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int>> selector);
        public static double? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int?>> selector);
        public static float Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, float>> selector);
        public static float? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, float?>> selector);
        public static double Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, long>> selector);
        public static double? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, long?>> selector);
        public static double Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, double>> selector);
        public static double? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, double?>> selector);
        public static decimal Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal>> selector);
        public static decimal? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector);
        public static IQueryable<TResult> Cast<TResult>(this IQueryable source);
        public static IQueryable<TSource> Concat<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);
        public static bool Contains<TSource>(this IQueryable<TSource> source, TSource item, IEqualityComparer<TSource> comparer);
        public static bool Contains<TSource>(this IQueryable<TSource> source, TSource item);
        public static int Count<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static int Count<TSource>(this IQueryable<TSource> source);
        public static IQueryable<TSource> DefaultIfEmpty<TSource>(this IQueryable<TSource> source, TSource defaultValue);
        public static IQueryable<TSource> DefaultIfEmpty<TSource>(this IQueryable<TSource> source);
        public static IQueryable<TSource> Distinct<TSource>(this IQueryable<TSource> source, IEqualityComparer<TSource> comparer);
        public static IQueryable<TSource> Distinct<TSource>(this IQueryable<TSource> source);
        public static TSource ElementAt<TSource>(this IQueryable<TSource> source, int index);
        public static TSource ElementAtOrDefault<TSource>(this IQueryable<TSource> source, int index);
        public static IQueryable<TSource> Except<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);
        public static IQueryable<TSource> Except<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer);
        public static TSource First<TSource>(this IQueryable<TSource> source);
        public static TSource First<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static TSource FirstOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static TSource FirstOrDefault<TSource>(this IQueryable<TSource> source);
        public static IQueryable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<TKey, IEnumerable<TElement>, TResult>> resultSelector);
        public static IQueryable<TResult> GroupBy<TSource, TKey, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TKey, IEnumerable<TSource>, TResult>> resultSelector);
        public static IQueryable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector);
        public static IQueryable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<TKey, IEnumerable<TElement>, TResult>> resultSelector, IEqualityComparer<TKey> comparer);
        public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector);
        public static IQueryable<TResult> GroupBy<TSource, TKey, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TKey, IEnumerable<TSource>, TResult>> resultSelector, IEqualityComparer<TKey> comparer);
        public static IQueryable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, IEqualityComparer<TKey> comparer);
        public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IEqualityComparer<TKey> comparer);
        public static IQueryable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, IEnumerable<TInner>, TResult>> resultSelector, IEqualityComparer<TKey> comparer);
        public static IQueryable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, IEnumerable<TInner>, TResult>> resultSelector);
        public static IQueryable<TSource> Intersect<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer);
        public static IQueryable<TSource> Intersect<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);
        public static IQueryable<TResult> Join<TOuter, TInner, TKey, TResult>(this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, TInner, TResult>> resultSelector, IEqualityComparer<TKey> comparer);
        public static IQueryable<TResult> Join<TOuter, TInner, TKey, TResult>(this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, TInner, TResult>> resultSelector);
        public static TSource Last<TSource>(this IQueryable<TSource> source);
        public static TSource Last<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static TSource LastOrDefault<TSource>(this IQueryable<TSource> source);
        public static TSource LastOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static long LongCount<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static long LongCount<TSource>(this IQueryable<TSource> source);
        public static TResult Max<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector);
        public static TSource Max<TSource>(this IQueryable<TSource> source);
        public static TResult Min<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector);
        public static TSource Min<TSource>(this IQueryable<TSource> source);
        public static IQueryable<TResult> OfType<TResult>(this IQueryable source);
        public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer);
        public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector);
        public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector);
        public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer);
        public static IQueryable<TSource> Reverse<TSource>(this IQueryable<TSource> source);
        public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector);
        public static IQueryable<TResult> Select<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector);
        public static IQueryable<TResult> SelectMany<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TResult>>> selector);
        public static IQueryable<TResult> SelectMany<TSource, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, IEnumerable<TResult>>> selector);
        public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, int, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector);
        public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector);
        public static bool SequenceEqual<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer);
        public static bool SequenceEqual<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);
        public static TSource Single<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static TSource Single<TSource>(this IQueryable<TSource> source);
        public static TSource SingleOrDefault<TSource>(this IQueryable<TSource> source);
        public static TSource SingleOrDefault<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static IQueryable<TSource> Skip<TSource>(this IQueryable<TSource> source, int count);
        public static IQueryable<TSource> SkipWhile<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static IQueryable<TSource> SkipWhile<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate);
        public static decimal Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal>> selector);
        public static decimal? Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector);
        public static double? Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, double?>> selector);
        public static double Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, double>> selector);
        public static int? Sum(this IQueryable<int?> source);
        public static float Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, float>> selector);
        public static int Sum(this IQueryable<int> source);
        public static long Sum(this IQueryable<long> source);
        public static long? Sum(this IQueryable<long?> source);
        public static float Sum(this IQueryable<float> source);
        public static float? Sum(this IQueryable<float?> source);
        public static double Sum(this IQueryable<double> source);
        public static double? Sum(this IQueryable<double?> source);
        public static float? Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, float?>> selector);
        public static decimal Sum(this IQueryable<decimal> source);
        public static decimal? Sum(this IQueryable<decimal?> source);
        public static int Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int>> selector);
        public static long? Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, long?>> selector);
        public static long Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, long>> selector);
        public static int? Sum<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int?>> selector);
        public static IQueryable<TSource> Take<TSource>(this IQueryable<TSource> source, int count);
        public static IQueryable<TSource> TakeWhile<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static IQueryable<TSource> TakeWhile<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate);
        public static IOrderedQueryable<TSource> ThenBy<TSource, TKey>(this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer);
        public static IOrderedQueryable<TSource> ThenBy<TSource, TKey>(this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector);
        public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey>(this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector);
        public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey>(this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer);
        public static IQueryable<TSource> Union<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer);
        public static IQueryable<TSource> Union<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);
        public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate);
        public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);
        public static IQueryable<TResult> Zip<TFirst, TSecond, TResult>(this IQueryable<TFirst> source1, IEnumerable<TSecond> source2, Expression<Func<TFirst, TSecond, TResult>> resultSelector);
    }
}
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo03_Read
{
    class Program
    {
        static void Main(string[] args)
        {
            //TestLinqAllList();
            TestLinqWithConditionAndReturnList();
            //TestLinqWithConditionAndReturnFirstOrDefault();
        }

        static void TestLinqAllList()
        {
            EmployeeContext context = new EmployeeContext();
            List<Employee> employeeList = context.Employees.AsQueryable()
                                                 .ToList();
            Console.WriteLine(employeeList.ToJson());
        }

        static void TestLinqWithConditionAndReturnList()
        {
            EmployeeContext context = new EmployeeContext();
            List<Employee> employeeList = context.Employees.AsQueryable()
                                                 .Where(r => r.Name == "李四")
                                                 .ToList();
            Console.WriteLine(employeeList.ToJson());            
        }

        static void TestLinqWithConditionAndReturnFirstOrDefault()
        {
            EmployeeContext context = new EmployeeContext();
            Employee employee = context.Employees.AsQueryable()
                                       .Where(r => r.Name == "李四")
                                       .FirstOrDefault();
            if(employee != null)
            {
                Console.WriteLine(employee.ToJson());
            }
        }
    }
}