sql server在MongoDB中带有分区的行号,用于返回行的子集

时间:2014-07-18 15:19:02

标签: mongodb mongodb-.net-driver

如何使用MongoDB-Csharp驱动程序编写以下查询

 SELECT SubSet.*
 FROM   ( SELECT    T.ProductName ,
                    T.Price ,
                    ROW_NUMBER() OVER ( PARTITION BY T.ProductName ORDER BY T.ProductName ) AS ProductRepeat
          FROM      myTable T
        ) SubSet
 WHERE  SubSet.ProductRepeat = 1

我想要实现的是

集合

  • 产品名称|价格| SKU
  • 帽| 10 | AB123
  • 袋| 5 | ED567
  • 帽| 20 | CD345
  • 帽| 5 | EC123

预期结果

  • 产品名称|价格| SKU
  • 帽| 10 | AB123
  • 袋| 5 | ED567

这是一次尝试(请不要使用对象和字段)

public List<ProductOL> Search(ProductOL obj, bool topOneOnly)
        {
            List<ProdutOL> products = new List<ProductOL>();

            var database = MyMongoClient.Instance.OpenToRead(dbName: ConfigurationManager.AppSettings["MongoDBDefaultDB"]);
            var collection = database.GetCollection<RawBsonDocument>("Products");
            List<IMongoQuery> build = new List<IMongoQuery>();

            if (!string.IsNullOrEmpty(obj.ProductName))
            {
                var ProductNameQuery = Query.Matches("ProductName", new BsonRegularExpression(obj.ProductName, "i"));
                build.Add(ProductNameQuery);
            }
            if (!string.IsNullOrEmpty(obj.BrandName))
            {
                var brandNameQuery = Query.Matches("BrandName", new BsonRegularExpression(obj.BrandName, "i"));
                build.Add(brandNameQuery);
            }

            var fullQuery = Query.And(build.ToArray());
            products = collection.FindAs<ProductOL>(fullQuery).SetSortOrder(SortBy.Ascending("ProductName")).ToList();
            if (topOneOnly)
            {
                var tmpProducts = new List<ProductOL>();
                foreach (var item in products)
                {
                    if (tmpProducts.Any(x => x.ProductName== item.ProductName)) { }
                    else
                        tmpProducts.Add(item);
                }
                products = tmpProducts;
            }
            return products;
        }

1 个答案:

答案 0 :(得分:0)

感谢@Stennie在他的回答的帮助下,我可以提出C#聚合代码

 var match = new BsonDocument 
                { 
                    {
                        "$match", 
                        new BsonDocument{
                            {"ProductName", new BsonRegularExpression("cap", "i")}
                        }
                    }
                };

            var group = new BsonDocument
                { 
                        {"$group", 
                        new BsonDocument 
                            { 
                                {"_id", "$ProductName"},
                                {"SKU", new BsonDocument{
                                            {
                                                "$first", "$SKU"
                                                }}
                                }
                            }}
                };

            var project = new BsonDocument{
                {
                    "$project", 
                    new BsonDocument
                    {
                        {"_id", 0 },
                        {"ProductName","$_id" },
                        {"SKU", 1}                      
                    }}};

            var sort = new BsonDocument{
                     {
                         "$sort",
                         new BsonDocument
                         {
                            {
                                "ProductName",1 }
                         }
                    }};

            var pipeline = new[] { match, group, project, sort };
            var aggResult = collection.Aggregate(pipeline);
            var products= aggResult.ResultDocuments.Select(BsonSerializer.Deserialize<ProductOL>).ToList();

使用AggregateArgs

AggregateArgs args = new AggregateArgs();
            List<BsonDocument> piple = new List<BsonDocument>();
            piple.Add(match);
            piple.Add(group);
            piple.Add(project);
            piple.Add(sort);
            args.Pipeline = piple;
           // var pipeline = new[] { match, group, project, sort };
            var aggResult = collection.Aggregate(args);
            products = aggResult.Select(BsonSerializer.Deserialize<ProductOL>).ToList();