C# Mongodb.Driver 获取 $lookup 查询结果

上一篇 Mongodb $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.执行效果

 

posted @ 2021-07-26 16:05  Howard见贤思齐  阅读(551)  评论(0)    收藏  举报