示例#1
0
        public static T FindOneAndUpdate <T>(string token, string collectionName, FilterDefinition <BsonDocument> filter, UpdateDefinition <T> entity, FindOneAndUpdateOptions <T> findOneAndUpdateOptions = null, Notification notification = null)
        {
            if (findOneAndUpdateOptions == null)
            {
                findOneAndUpdateOptions = new FindOneAndUpdateOptions <T>
                {
                    IsUpsert       = true,
                    ReturnDocument = ReturnDocument.After
                };
            }

            var request = new FindOneAndUpdate
            {
                CollectionName          = collectionName,
                Filter                  = filter.ToJson(),
                FindOneAndUpdateOptions = findOneAndUpdateOptions.ToBson(),
                Document                = entity.RenderToBsonDocument(),
                Notification            = notification,
                OutputMode              = JsonOutputMode.Strict,
                CultureCode             = CultureInfo.CurrentCulture.Name
            };

            var response = Send <FindOneAndReplaceResponse>("entities/" + collectionName + "/findOneAndReplace", request, "POST");

            if (response != null && response.Result.Any())
            {
                var documentAsEntity = BsonSerializer.Deserialize <T>(response.Result);
                return(documentAsEntity);
            }
            return(default(T));
        }
 public override string ToString()
 {
     return(FilterDefinition.RenderToBsonDocument().ToJson() + "\n---with---\n" +
            UpdateDefinition.RenderToBsonDocument().ToJson());
 }
示例#3
0
        public static void CRUD()
        {
            var exp = ExpressionMapper.MapExp <StudentVm, Student>();

            #region 连接Mongodb
            var client = new MongoClient("mongodb://localhost:27017");

            var database = client.GetDatabase("school");

            #endregion

            #region 约束 驼峰命名法

            var pack = new ConventionPack();
            pack.Add(new CamelCaseElementNameConvention());
            ConventionRegistry.Register("CamelCaseElementNameConvention", pack, t => true);

            #endregion

            #region 1.插入数据

            var collection = database.GetCollection <Student>("student");
            if (collection.CountDocuments(a => true) == 0)
            {
                collection.InsertOne(new Student()
                {
                    Age      = 27,
                    Name     = "zhangsan",
                    Address  = "河南",
                    Birthday = DateTime.Parse("1992-06-17 12:35:12"),
                    Hobbies  = new[] { "阅读", "跑步", },
                    Courses  = new List <Course>()
                    {
                        new Course()
                        {
                            Name  = "计算机理论",
                            Count = 30
                        },
                        new Course()
                        {
                            Name  = "操作系统",
                            Count = 35
                        }
                    }
                });

                collection.InsertOne(new Student()
                {
                    Age      = 23,
                    Name     = "lisi",
                    Address  = "北京",
                    Birthday = DateTime.Parse("1996-05-17 14:40:08"),
                    Hobbies  = new[] { "游戏", "睡觉", "代码" },
                    Courses  = new List <Course>()
                    {
                        new Course()
                        {
                            Name  = "c#语言基础",
                            Count = 30
                        },
                        new Course()
                        {
                            Name  = "编译原理",
                            Count = 35
                        }
                    }
                });

                var bulkList = new List <Student>()
                {
                    new Student()
                    {
                        Age      = 26,
                        Name     = "wangwu",
                        Address  = "河北",
                        Birthday = DateTime.Parse("1993-08-17 16:40:08"),
                        Hobbies  = new[] { "睡觉" },
                        Courses  = new List <Course>()
                        {
                            new Course()
                            {
                                Name  = "网络编程",
                                Count = 30
                            },
                            new Course()
                            {
                                Name  = "操作系统",
                                Count = 35
                            }
                        }
                    },
                    new Student()
                    {
                        Age      = 29,
                        Name     = "wangwu",
                        Address  = "南京",
                        Birthday = DateTime.Parse("1990-05-17 14:40:08"),
                        Hobbies  = new[] { "游戏", "睡觉", "代码", "逛街" },
                        Courses  = new List <Course>()
                        {
                            new Course()
                            {
                                Name  = "网络编程",
                                Count = 30
                            },
                            new Course()
                            {
                                Name  = "操作系统",
                                Count = 35
                            }
                        }
                    }
                };

                collection.InsertMany(bulkList);
            }



            #endregion

            Console.WriteLine();

            #region 2.过滤器(Filter)
            Console.WriteLine("==============过滤==============");

            //空过滤器匹配全部
            FilterDefinition <BsonDocument> filter0 = Builders <BsonDocument> .Filter.Empty;

            //一般匹配
            FilterDefinition <BsonDocument> filter1 = "{name:'zhangsan'}";
            FilterDefinition <BsonDocument> filter2 = new BsonDocument("name", "zhangsan");

            var builder3 = Builders <BsonDocument> .Filter;
            var filter3  = builder3.Eq("name", "zhangsan") & builder3.Gt("age", 10);


            var builder4 = Builders <Student> .Filter;
            var filter4  = (builder4.Eq("name", "zhangsan") & builder4.Gt(a => a.Age, 10)) | builder4.Gt(a => a.Birthday, DateTime.Parse("1990-01-01"));



            var query21   = database.GetCollection <BsonDocument>("student").Find(filter1);
            var json21    = query21.ToString();
            var student21 = query21.FirstOrDefault();
            Console.WriteLine(json21);

            var query22   = database.GetCollection <BsonDocument>("student").Find(filter2);
            var json22    = query22.ToString();
            var student22 = query22.FirstOrDefault();
            Console.WriteLine(json22);


            var query23   = database.GetCollection <BsonDocument>("student").Find(filter3);
            var json23    = query23.ToString();
            var student23 = query23.FirstOrDefault();
            Console.WriteLine(json23);


            var query24   = database.GetCollection <Student>("student").Find(filter4);
            var json24    = query24.ToString();
            var student24 = query24.FirstOrDefault();
            Console.WriteLine(json24);


            //数组匹配
            var builder5 = Builders <BsonDocument> .Filter;
            var filter25 = builder5.AnyEq("courses.name", "操作系统");

            var query25   = database.GetCollection <BsonDocument>("student").Find(filter25);
            var json25    = query25.ToString();
            var student25 = database.GetCollection <BsonDocument>("student").Find(filter25).ToList();
            Console.WriteLine(json25);


            var builder6  = Builders <Student> .Filter;
            var filter26  = builder6.ElemMatch(a => a.Courses, a => a.Name == "操作系统");
            var query26   = database.GetCollection <Student>("student").Find(filter26);
            var json26    = query26.ToString();
            var student26 = database.GetCollection <Student>("student").Find(filter26).ToList();
            Console.WriteLine(json26);


            var builder7  = Builders <Student> .Filter;
            var filter27  = builder7.ElemMatch(a => a.Courses, a => a.Name == "操作系统") & builder7.ElemMatch(a => a.Courses, a => a.Count > 30);
            var query27   = database.GetCollection <Student>("student").Find(filter27);
            var json27    = query27.ToString();
            var student27 = database.GetCollection <Student>("student").Find(filter27).ToList();
            Console.WriteLine(json27);



            var builder8  = Builders <Student> .Filter;
            var filter28  = builder8.ElemMatch(a => a.Courses, a => a.Name == "操作系统") | builder8.ElemMatch(a => a.Courses, a => a.Count > 30);
            var query28   = database.GetCollection <Student>("student").Find(filter28);
            var json28    = query28.ToString();
            var student28 = database.GetCollection <Student>("student").Find(filter28).ToList();
            Console.WriteLine(json28);



            var builder9  = Builders <Student> .Filter;
            var filter29  = builder9.SizeGte(a => a.Hobbies, 4);
            var query29   = database.GetCollection <Student>("student").Find(filter29);
            var json29    = query29.ToString();
            var student29 = database.GetCollection <Student>("student").Find(filter29).ToList();
            Console.WriteLine(json29);



            var builder10  = Builders <Student> .Filter;
            var filter210  = builder10.In(a => a.Name, new[] { "zhangsan", "wangwu" });
            var query210   = database.GetCollection <Student>("student").Find(filter210);
            var json210    = query210.ToString();
            var student210 = database.GetCollection <Student>("student").Find(filter210).ToList();
            Console.WriteLine(json210);



            var builder11  = Builders <Student> .Filter;
            var filter211  = builder11.AnyEq(a => a.Hobbies, "睡觉");
            var query211   = database.GetCollection <Student>("student").Find(filter211);
            var json211    = query211.ToString();
            var student211 = database.GetCollection <Student>("student").Find(filter211).ToList();
            Console.WriteLine(json211);


            var builder12  = Builders <Student> .Filter;
            var filter212  = builder12.Regex(a => a.Name, "ng");
            var query212   = database.GetCollection <Student>("student").Find(filter212);
            var json212    = query212.ToString();
            var student212 = database.GetCollection <Student>("student").Find(filter212).ToList();
            Console.WriteLine(json212);



            var indexes = database.GetCollection <Student>("student").Indexes;

            var indexKey = Builders <Student> .IndexKeys.Text(a => a.Name);

            var model = new CreateIndexModel <Student>(indexKey);
            indexes.CreateOne(model);

            var list = indexes.List().ToList();

            var builder13  = Builders <Student> .Filter;
            var filter213  = builder13.Text("zhangsan");
            var query213   = database.GetCollection <Student>("student").Find(filter213);
            var json213    = query213.ToString();
            var student213 = database.GetCollection <Student>("student").Find(filter213).ToList();
            Console.WriteLine(json213);

            Console.WriteLine("==============过滤==============");

            #endregion

            Console.WriteLine();

            #region 3.投影(Projections)

            Console.WriteLine("==============投影==============");

            ProjectionDefinition <BsonDocument> projection1 = "{age:1}";
            ProjectionDefinition <BsonDocument> projection2 = new BsonDocument("age", 1);

            var json31 = projection1.RenderToBsonDocument();

            var students31 = database.GetCollection <BsonDocument>("student").Find(a => true).Project(projection1).ToList();


            Console.WriteLine(json31);

            var projection3 = Builders <Student> .Projection.Include(a => a.Age).Include(a => a.Name);

            var projection4 = Builders <Student> .Projection.Exclude(a => a.Id).Exclude(a => a.Courses);

            var projection5 = Builders <Student> .Projection.Exclude(a => a.Id);

            var query33    = database.GetCollection <Student>("student").Find(a => true).Project <Student>(projection3);
            var json33     = query33.ToString();
            var students33 = query33.ToList();
            Console.WriteLine(json33);

            var query34    = database.GetCollection <Student>("student").Find(a => true).Project <Student>(projection4);
            var json34     = query34.ToString();
            var students34 = query34.ToList();
            Console.WriteLine(json34);

            var query35    = database.GetCollection <Student>("student").Find(a => true).Project <Student>(projection5);
            var json35     = query35.ToString();
            var students35 = query35.ToList();
            Console.WriteLine(json35);

            var projection6 = Builders <Student> .Projection.Expression(a => new StudentVm()
            {
                Age  = a.Age,
                Id   = a.Id,
                Name = a.Name
            });

            var query36    = database.GetCollection <Student>("student").Find(a => true).Project(projection6);
            var json36     = query36.ToString();
            var students36 = query36.ToList();
            Console.WriteLine(json36);


            var students37 = database.GetCollection <Student>("student").Find(a => true).Project(a => new StudentVm
            {
                Age  = a.Age,
                Id   = a.Id,
                Name = a.Name
            }).ToList();


            var query38 = database.GetCollection <Student>("student").Find(a => true).Project(a => new
            {
                a.Age,
                a.Id,
                a.Name
            });
            var json38     = query38.ToString();
            var students38 = query38.ToList();
            Console.WriteLine(json38);



            var query39 = database.GetCollection <Student>("student").Find(a => true).Project(a => new
            {
                AgeAndName = a.Name + "," + a.Age.ToString()
            });
            var json39     = query39.ToString();
            var students39 = query39.ToList();
            Console.WriteLine(json39);



            //自动投影 根据StudentVm中的属性自动生成
            var query310 = database.GetCollection <Student>("student").Find(a => true).Project(ExpressionMapper.MapExp <Student, StudentVm>());
            var json310  = query310.ToString();
            var listss   = query310.ToList();
            Console.WriteLine($"自动投影:{json310}");

            Console.WriteLine("==============投影==============");

            #endregion

            Console.WriteLine();

            #region 4.排序(Sort)
            Console.WriteLine("==============排序==============");

            SortDefinition <BsonDocument> sort1 = "{ age: 1 }";

            SortDefinition <BsonDocument> sort2 = Builders <BsonDocument> .Sort.Ascending("_id").Descending("age");

            SortDefinition <Student> sort3 = Builders <Student> .Sort.Ascending(a => a.Id).Descending(a => a.Age);

            var query41   = database.GetCollection <Student>("student").Find(new BsonDocument()).Sort(sort3);
            var json41    = query41.ToString();
            var student41 = query41.ToList();
            Console.WriteLine(json41);
            Console.WriteLine("==============排序==============");

            #endregion

            Console.WriteLine();

            #region 5.更新(Update)

            Console.WriteLine("==============更新==============");


            UpdateDefinition <BsonDocument> update1 = "{ $set: { age: 25 } }";

            UpdateDefinition <BsonDocument> update2 = new BsonDocument("$set", new BsonDocument("age", 1));

            //数组更新添加
            var updateBuilder = Builders <Student> .Update;
            UpdateDefinition <Student> update3 = updateBuilder
                                                 .Set(a => a.Name, "修改名称")
                                                 .Set(a => a.Age, 25)
                                                 .Push(a => a.Hobbies, "购物")
                                                 .PushEach(a => a.Courses, new List <Course>()
            {
                new Course()
                {
                    Name  = "马克思主义理论基础",
                    Count = 10,
                },
                new Course()
                {
                    Name  = "毛泽东思想概论",
                    Count = 10,
                }
            })
                                                 .CurrentDate(a => a.Birthday, UpdateDefinitionCurrentDateType.Date);

            var json53    = update3.RenderToBsonDocument();
            var student53 = collection.UpdateOne(a => a.Name == "zhangsan", update3);
            Console.WriteLine(json53);


            //数组更新移除
            UpdateDefinition <Student> update4 = updateBuilder
                                                 .Set(a => a.Name, "zhangsan")
                                                 .Inc(a => a.Age, 100)
                                                 .Pull(a => a.Hobbies, "购物")
                                                 .PullFilter(a => a.Courses, a => a.Name == "毛泽东思想概论");

            var json54    = update4.RenderToBsonDocument();
            var student54 = collection.UpdateOne(a => a.Name == "修改名称", update4);
            Console.WriteLine(json54);


            //匹配数组中得某个元素,并更新这个元素的相关字段
            UpdateDefinition <Student> update5 = updateBuilder
                                                 .Set(a => a.Courses[-1].Name, "ssss");

            var json55    = update5.RenderToBsonDocument();
            var student55 = collection.UpdateOne(a => a.Courses.Any(b => b.Name == "马克思主义理论基础"), update5);
            Console.WriteLine(json55);



            UpdateDefinition <Student> update6 = updateBuilder
                                                 .Mul(a => a.Age, 12);

            var op = new FindOneAndUpdateOptions <Student>()
            {
                IsUpsert       = true,
                ReturnDocument = ReturnDocument.After
            };

            var student56 = collection.FindOneAndUpdate <Student>(a => a.Age > 26, update6, op);



            var update7 = updateBuilder
                          .PopFirst(a => a.Hobbies)
                          .PopLast(a => a.Courses);
            var json57    = update7.RenderToBsonDocument();
            var student57 = collection.UpdateOne(a => a.Name == "zhangsan", update7);
            Console.WriteLine(json57);



            var update8 = updateBuilder
                          .SetOnInsert(a => a.Name, "ssss");

            var json58    = update8.RenderToBsonDocument();
            var student58 = collection.UpdateOne(a => a.Name == "ls", update8, new UpdateOptions()
            {
                IsUpsert = true
            });
            Console.WriteLine(json58);


            var update9 = updateBuilder
                          .Rename(a => a.Address, "homeAddress");

            var json59    = update9.RenderToBsonDocument();
            var student59 = collection.UpdateOne(a => a.Name == "wangwu", update9);
            Console.WriteLine(json59);


            var update10 = updateBuilder
                           .Set(a => a.Name, "**");

            var json510    = update10.RenderToBsonDocument();
            var student510 = collection.UpdateMany(a => a.Age > 20, update10);
            Console.WriteLine(json510);

            //根据条件动态更新
            var update11 = updateBuilder
                           .Set(a => a.Name, "**");
            if (true)
            {
                update11 = update11.Set(a => a.Age, 12);
            }
            var json511 = update11.RenderToBsonDocument();
            Console.WriteLine(json511);

            Console.WriteLine("==============更新==============");
            #endregion

            Console.WriteLine();

            #region 6.聚合(Aggregation)


            Console.WriteLine("==============聚合==============");


            var pipeline1 = new BsonDocument[] {
                new BsonDocument {
                    { "$sort", new BsonDocument("_id", 1) }
                },
                new BsonDocument {
                    { "$group", new BsonDocument {
                          { "_id", "$age" },
                          { "min", new BsonDocument {
                                             { "$min", "$age" }
                                         } }
                      } }
                }
            };

            var student61 = collection.Aggregate <BsonDocument>(pipeline1).ToListAsync();



            var agg = collection.Aggregate();

            var gg = agg
                     .Match(a => a.Age > 10)
                     .Project(a => new
            {
                a.Age,
                a.Name
            })
                     .Group(key => key.Age, g => new
            {
                age   = g.Key,
                count = g.Count(),
                max   = g.Max(a => a.Age),
                min   = g.Min(a => a.Age),
                avg   = g.Average(a => a.Age)
            });


            var json62    = gg.ToString();
            var student62 = gg.ToList();
            Console.WriteLine(json62);

            Console.WriteLine("==============聚合==============");


            #endregion

            Console.WriteLine();

            #region 7.删除数据

            var student71 = collection.DeleteOne(a => a.Age > 100);

            var student72 = collection.DeleteMany(a => a.Age > 100);

            var op7 = new FindOneAndDeleteOptions <Student>()
            {
            };
            var student73 = collection.FindOneAndDelete <Student>(a => a.Age > 100, op7);


            #endregion

            Console.WriteLine();

            #region 8.快速使用

            Console.WriteLine("==============快速使用==============");

            var student80 = collection.Find(a => true).FirstOrDefault();

            var students81 = collection.Find(a => true).ToList();

            var students82 = collection.Find(a => true).Skip(80).Limit(20).ToList();

            var long83 = collection.Find(a => true).CountDocuments();

            var bool84 = collection.Find(a => true).Any();

            var students85 = collection.Find(a => true).SortBy(a => a.Id).SortByDescending(a => a.Age).ToList();


            var queryable = collection.AsQueryable();

            var queryable86 = queryable.Where(a => a.Age > 20).Select(a => new
            {
                a.Age,
                a.Name
            })
                              .GroupBy(a => a.Age)
                              .Select(g => new
            {
                g.Key,
                Max   = g.Max(a => a.Age),
                Min   = g.Min(a => a.Age),
                Avg   = g.Average(a => a.Age),
                Name  = g.First().Name,
                Count = g.Count(),
            });


            var json86 = queryable86.ToString();
            Console.WriteLine(json86);

            Console.WriteLine("==============快速使用==============");


            #endregion

            #region 9.执行命令

            //批量更新不同的值
            var dic = new Dictionary <string, object>()
            {
                { "update", "students" },
                { "updates", new List <BsonDocument>() }
            };

            //循环生成不同的更新命令
            for (int i = 0; i < 10; i++)
            {
                ((List <BsonDocument>)dic["updates"]).Add(new BsonDocument()
                {
                    { "q", new BsonDocument("age", i * 5) },
                    {
                        "u", new BsonDocument("$set",
                                              new BsonDocument()
                        {
                            { "age", i + 2 },
                            { "name", i + "-" }
                        }
                                              )
                    },
                });
            }

            var result = database.RunCommand <BsonDocument>(new BsonDocument(dic));

            #endregion
            //批量操作
            #region 10.批量操作
            var write = new UpdateOneModel <Student>(filter211, update10);
            collection.BulkWrite(new List <UpdateOneModel <Student> >()
            {
                write
            });
            #endregion

            #region 11.DbContext封装
            var students = SchoolDbContext.Students.Find(a => true);

            using (var session = SchoolDbContext.MongoClient.StartSession())
            {
                session.StartTransaction();
                SchoolDbContext.Students.Find(session, a => true);
                session.CommitTransaction();
            }


            #endregion


            #region 12.测试

            WriteConcern writeConcern = new WriteConcern();

            var update12 = Builders <Student> .Update.Set(a => a.Age, 25);

            var result12 = database.GetCollection <Student>("student22").UpdateOne(a => a.Name == "ss", update12);

            #endregion

            #region 13.聚合2

            var p1         = PipelineStageDefinitionBuilder.Match <Student>(a => a.Name == "**");
            var student101 = collection.Aggregate().AppendStage(p1).ToList();

            #endregion

            #region 13.连接

            //参看:https://stackoverflow.com/questions/50530363/aggregate-lookup-with-c-sharp

            Console.WriteLine("==============连接查询==============");
            var studentQuery   = database.GetCollection <Student>("student").AsQueryable();
            var classroomQuery = database.GetCollection <ClassRoom>("classroom").AsQueryable();

            //使用集合的方式来解决左连接
            var student102 = from s in studentQuery.Where(a => a.Name == "**")
                             join c in classroomQuery on s.classroomid equals c.Id into joined
                             select new
            {
                s.Name,
                s.Age,
                classname = joined
            };

            var query102 = student102.ToString();
            Console.WriteLine(query102);
            var result102 = student102.ToList();

            //database.GetCollection<Student>("student").Aggregate()
            //    .Lookup().ToList();


            #endregion

            #region 14 动态生成根据id查找

            var result141 = collection.FindById("5d8894a114294d2acc82ecd6").Result;
            #endregion
        }