MongoDB(C#)系列三,使用Linq进行简单查询_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > MongoDB(C#)系列三,使用Linq进行简单查询

MongoDB(C#)系列三,使用Linq进行简单查询

 2013/10/20 10:47:38  FrancisYoung  博客园  我要评论(0)
  • 摘要:操作数据时,最常见的操作就是查询。查询一个集合中的数据时,需要先调用MongoCollection的FindxxxAs系列方法,这些方法有两个特点:都是泛型的,因此用起来非常简单,不用在强制类型转换了,其次他们都需要一个类型为IQueryable的参数,这个参数用于查询,排序...操作。想要运行下面的代码,首先需要引用MongoDB.Bson.dll和MongoDb.Driver.dll程序集,然后,还要引入如下几个命名空间:usingSystem;usingSystem.Linq
  • 标签:C# 使用 MongoDB

操作数据时,最常见的操作就是查询。查询一个集合中的数据时,需要先调用MongoCollection的FindxxxAs系列方法,这些方法有两个特点:都是泛型的,因此用起来非常简单,不用在强制类型转换了,其次他们都需要一个类型为IQueryable的参数,这个参数用于查询,排序...操作。

想要运行下面的代码,首先需要引用MongoDB.Bson.dll和MongoDb.Driver.dll程序集,然后,还要引入如下几个命名空间:

using System;
using System.Linq;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;

1.使用FindOneAs查询一条数据

  关于,FindOneAs方法,MongoCollection中定义了如下几个重载

        public virtual TDocument FindOneAs<TDocument>();

        public virtual TDocument FindOneAs<TDocument>(FindOneArgs args);

        public virtual TDocument FindOneAs<TDocument>(IMongoQuery query);

最常用的莫过于第三个和第三个重载版本

首先使用第二个版本进行查询数据,为了查询数据,首先构造一个FindOneArgs对象,如下:

            FindOneArgs args = new FindOneArgs {
                Query = Query.EQ("stdid", 1),//查询stdid field等于1的document
            };

上面这个构造就相当于在sql中如下语句:select * from student where stdid=1。

注意,上面仅仅是定义了一个查询,但是还没有真正的进行查询,想要查询,需要调用FindOneAs方法如下:

    var std = collection.FindOneAs<Student>(args);

完整代码:

class="code_img_closed" id="code_img_closed_ab0cb006-51ed-4768-9568-2ea76072b749" />logs_code_hide('ab0cb006-51ed-4768-9568-2ea76072b749',event)" style="display: none;" />
       private static void FindOneArgsWithEqQueryDemo() {
            //连接字符串,其中localhost是默认的本机地址,等同于ip+端口号。
            var connetionString = "mongodb://localhost/";
            var mongoUrl = new MongoUrl(connetionString);
            var clientSettings = MongoClientSettings.FromUrl(mongoUrl);
            var client = new MongoClient(clientSettings);
            
            var mongoServer = client.GetServer();
            var database = mongoServer.GetDatabase("firstDb");
            var collection = database.GetCollection("student");
            //为了便于测试,如果这个集合以及存在,先删除。
            collection.Drop();

            //下面三个insert方法,向collection集合中插入三条document,每个document都由stdid 和stdName field构成。
            collection.Insert(new BsonDocument {
                {"stdid",3},{"stdName","jack"}
            });

            collection.Insert(new BsonDocument {
                {"stdid",1},{"stdName","francis"}
            });

            collection.Insert(new BsonDocument {
                {"stdid",2},{"stdName","rows"}
            });

            //定义一个查询:查询stdid=1的文档
            FindOneArgs args = new FindOneArgs {
                Query = Query.EQ("stdid", 1),//查询stdid field等于1的document。
            };
            //查询
            var std = collection.FindOneAs<Student>(args);

            //输出查询结果
            Console.WriteLine(std.stdName);
        }
View Code

2.使用FindOneByIdAs根据_id查询一条数据。

  在MongoDB中,每一个文档都有一个_id,再插入数据时如果你不显示指定他,那么MongoDB就自动生成一个,自动的_id的布局非常特别,所以使用它来进行查询是非常非常快得。

  当然,在插入数据时,也可以显示指定一个_id,在C#中使用MongoDB.Driver.Builders.Object.GenerateNewId来产生一个_id。

  想要根据_id来进行查询,可以使用FindOneByIdAd。这个方法的描述如下:

       //
        // 摘要:
        //     Returns a cursor that can be used to find one document in this collection
        //     by its _id value as a TDocument.
        //
        // 参数:
        //   id:
        //     The id of the document.
        //
        // 类型参数:
        //   TDocument:
        //     The nominal type of the document.
        //
        // 返回结果:
        //     A TDocument (or null if not found).
        public virtual TDocument FindOneByIdAs<TDocument>(BsonValue id);

   想要根据_id查询,必须先构造他,构造之后进行查询,如下:  

      //生成一个_id  
    ObjectId id=ObjectId.GenerateNewId();     //根据_id进行查询 var std = collection.FindOneByIdAs<Student>(id);

  完整代码:

        private static void FindOneByIdDemo() {
            var connetionString = "mongodb://localhost/?w=1";
            var mongoUrl = new MongoUrl(connetionString);
            var clientSettings = MongoClientSettings.FromUrl(mongoUrl);
            var client = new MongoClient(clientSettings);
            var mongoServer = client.GetServer();
            var database = mongoServer.GetDatabase("firstDb");
            var collection = database.GetCollection("student");
            collection.Drop();
            
            collection.Insert(new BsonDocument {
                {"_id",ObjectId.GenerateNewId()},{"stdid",3},{"stdName","jack"}
            });

            collection.Insert(new BsonDocument {
                {"_id",ObjectId.GenerateNewId()},{"stdid",1},{"stdName","francis"}
            });

            ObjectId id=ObjectId.GenerateNewId();

            collection.Insert(new BsonDocument {
                {"_id",id},{"stdid",2},{"stdName","rows"}
            });

            var std = collection.FindOneByIdAs<Student>(id);
            
            Console.WriteLine(std.stdName);
        }
View Code

3.使用FindAs查询多条数据

   FindAs的定义如下:

public virtual MongoCursor<TDocument> FindAs<TDocument>(IMongoQuery query);

这个方法根据IMongoQuery进行查询。IMongoQuery是个接口,因此需要创建他的派生实现。

假如,我们想查询学好大于等于2的学生,怎么做呢?可以使用MongoDB.Driver.Builder.Query.Gt方法来定义,如下:

  IMongoQuery query = Query.GTE("stdid",2);

 开始查询,如下:

 var result=collection.FindAs<Student>(Query.GTE("stdid",2));

FindAs返回的是一个称作游标的东西。这里他返回的是MongoCursor<Student>,他实际上实现了IEnumerable<T>接口,因此,游标说白了就是一个集合。现在可以使用foreach来遍历他,如下:

            foreach (var each in result) {
                Console.WriteLine(each.stdName);
            }

完整代码:

        private static void FindAsDemo(){
            var connetionString = "mongodb://localhost/?w=1";
            var mongoUrl = new MongoUrl(connetionString);
            var clientSettings = MongoClientSettings.FromUrl(mongoUrl);
            var client = new MongoClient(clientSettings);
            var mongoServer = client.GetServer();
            var database = mongoServer.GetDatabase("firstDb");
            var collection = database.GetCollection("student");
            collection.Drop();

            collection.Insert(new BsonDocument {
                {"stdid",3},{"stdName","jack"}
            });

            collection.Insert(new BsonDocument {
                {"stdid",1},{"stdName","francis"}
            });

            collection.Insert(new BsonDocument {
                {"stdid",2},{"stdName","rows"}
            });
            IMongoQuery query = Query.GTE("stdid",2);
            var result=collection.FindAs<Student>(Query.GTE("stdid",2));
            foreach (var each in result) {
                Console.WriteLine(each.stdName);
            }
       }
View Code

扩展:由于MongoCursor<T>实现了IEnumerable<T>接口,而在.net 中,可以使用linq to object来操作IEnumerable<T>,因此他们之间的组合提供了更强大的功能。这个例子中,你可以继续在result上使用Select,如下:

  //需要引入System.Linq命名空间
result.Select(std=>std.stdName);

4.核心思想

在查询数据时,需要指定查询条件,在c#中,你可以通过using MongoDB.Driver.Builders.Query等类型来简化查询的创建。

发表评论
用户名: 匿名