C# Mongodb.Driver 获取 $lookup 查询结果
上一篇的语法是在MongoShell 中实现查询,那么我们在实际中该如何使用。如何将上述的查询结果,在页面中显示呢?
本文使用的mongodb 表结构,就是上一篇文章中的表结构。
1.Nuget 上 获取mongodb.Driver (本示例中使用的是 2.13 版本)
2.创建实体类
创建customer类
using MongoDB.Bson; using System; public class Customer { public ObjectId _id { get; set; } public int customerCode { get; set; } public string name { get; set; } public string phone { get; set; } public string address { get; set; } }
创建 Order 类
public class order { public ObjectId _id { get; set; } public int orderId { get; set; } public string orderCode { get; set; } public int customerCode { get; set; } public decimal price { get; set; } public List<Customer> customer { get; set; } public List<orderItem> orderItem { get; set; } }
创建 orderItem 类
using MongoDB.Bson; using System; public class orderItem { public ObjectId _id { get; set; } public int itemId { get; set; } public string productName { get; set; } public int qutity { get; set; } public int orderId { get; set; } }
3.创建MongodbHelper
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using MongoDB.Bson; using MongoDB.Driver; public class MongoDbHelper { private string databaseName = string.Empty; private IMongoClient client = null; private IMongoDatabase database = null; public MongoDbHelper(string connectionString) { this.client = new MongoClient(connectionString); } public MongoDbHelper(string connectionString, string databaseName) { this.client = new MongoClient(connectionString); this.database = client.GetDatabase(databaseName); } public string DatabaseName { get { return databaseName; } set { databaseName = value; this.database = client.GetDatabase(databaseName); } } /// <summary> /// 聚合查询 /// </summary> /// <param name="collectionName"></param> /// <param name="pipelineStage"></param> /// <returns></returns> public IAsyncCursor<BsonDocument>GetAggregate(string collectionName,PipelineDefinition<BsonDocument,BsonDocument> pipeline) { var list = database.GetCollection<BsonDocument>(collectionName).Aggregate(pipeline); return list; } }
4.实现查询
static void Main(string[] args) { var list= GetOrdersByAggregate();
foreach(var x in list)
{
Console.WriteLine(x.ToString());
}
Console.ReadLine(); } static List<order> GetOrdersByAggregate() { IList<IPipelineStageDefinition> stages = new List<IPipelineStageDefinition>(); string bsonFilter = "{$lookup:{from:\"Customer\",localField:\"customerCode\",foreignField:\"customerCode\",as:\"customer\"}}"; PipelineStageDefinition<BsonDocument, BsonDocument> stage1 = new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(bsonFilter); PipelineStageDefinition<BsonDocument, BsonDocument> stage2 = new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{$lookup:{from:\"orderItem\",localField:\"orderId\",foreignField:\"orderId\",as:\"orderItem\"}}"); stages.Add(stage1); stages.Add(stage2); PipelineDefinition<BsonDocument, BsonDocument> pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages); MongoDbHelper mongoHelper = new MongoDbHelper("mongodb://127.0.0.1","dbName"); var bsonElements = mongoHelper.GetAggregate("Order", pipeline).ToList(); List<order> orders = new List<order>(); foreach (var x in bsonElements) { var model = BsonSerializer.Deserialize<order>(x); orders.Add(model); } return orders; }
当前 PipelineStageDefinition 类,只能接受BsonDocument 类型,其他类型会报错;所以这里就采用拼接字符串形式。
BsonSerializer.Deserialize<order>(x) 使用Mongodb.Driver 自带的BsonSerializer 类做转化,将BsonDocumnet 转化为常用的强类型List<T>
5.执行效果


浙公网安备 33010602011771号