操作数据时,最常见的操作就是查询。查询一个集合中的数据时,需要先调用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等类型来简化查询的创建。