2015-07-28 70 views
2

目前,我使用MongoDb的Csharp驱动程序LinQ,并且遇到问题需要实现一种方法,比如在MongoDb上调用存储函数。实际上,我知道MongoDB没有存储过程机制。我需要有人提供建议或解决方案来解决这个问题。重要的是,数据将在MongoDB中完成,而不会在内存中完成。例如,我想返回一个带有自定义方法实现的过滤条件的列表。此方法计算基于字段依赖性。使用Mongodb-CSharp驱动程序调用函数

一个例子在内存中完成。

var list = collection.AsQueryable<Rule>().ToList();  
var result = list.Where(x => x.Active && CalcMethod(x.Rule)> 5); 

这里是自定义方法。

public static int CalcMethod(Rule rule) 
{   
    if(rule.Active) 
     // bypass check null 
     return rule.Weight.Unit * rule.Weight.Value; 
    else 
     // return something here 
} 

CalcMethod方法就像SQL Server中的函数。 我们是否可以用MongoDb或其他方法做到这一点,期望我们可以注入一种方法来计算数据和过滤,而不会在内存中完成。 每一个帮助将不胜感激。

+1

这种语法不适合MongoDB。如果您想在字段上计算结果,请查看[汇总框架](http://docs.mongodb.org/manual/core/aggregation-introduction/)。与一般的“查找”查询表单相比,它可以处理更多与SQL相关的“字段操作”。 –

+0

这个很好,谢谢。我坚持重用的方法是MongoDB不支持的复杂函数,上面只是一个基本的方法。由于查询是从UI构建的,因此它看起来像Linq表达式查询和系统许可可以动态地完成这些复杂的事情。使用聚合框架需要转换器来转换它们。如果你知道这样的事情,请给你的建议 – cyworld8x

回答

0

Soner, 我认为你可以使用聚合(或复杂事物的MapReduce)。即:

async void Main() 
{ 

    var client = new MongoClient("mongodb://localhost"); 
    var db = client.GetDatabase("TestSPLike"); 
    var col = db.GetCollection<Rule>("rules"); 

    await client.DropDatabaseAsync("TestSPLike"); // recreate if exists 
    await InsertSampleData(col); // save some sample data 

    var data = await col.Find(new BsonDocument()).ToListAsync(); 
    //data.Dump("All - initial"); 

/* 
    db.rules.aggregate(
    [ 
    { $match: 
     { 
     "Active":true 
     } 
    }, 
    { $project: 
     { 
     Name: 1, 
     Active: 1, 
     Weight:1, 
     Produce: { $multiply: [ "$Weight.Unit", "$Weight.Value" ] } 
     } 
    }, 
    { $match: 
     { 
      Produce: {"$gt":5} 
     } 
    } 
    ] 
) 
*/ 

var aggregate = col.Aggregate() 
    .Match(new BsonDocument{ {"Active", true} }) 
    .Project(new BsonDocument { 
     {"Name", 1}, 
     {"Active", 1}, 
     {"Weight",1}, 
     {"Produce", 
     new BsonDocument{ 
      { "$multiply", new BsonArray{"$Weight.Unit", "$Weight.Value"} } 
     }} 
    }) 
    .Match(new BsonDocument { 
     { "Produce", 
      new BsonDocument{ {"$gt",5} } 
      } 
      }) 
    .Project(new BsonDocument { 
     {"Name", 1}, 
     {"Active", 1}, 
     {"Weight",1} 
     }); 
    var result = await aggregate.ToListAsync(); 
    //result.Dump(); 
} 

private async Task InsertSampleData(IMongoCollection<Rule> col) 
{ 
var data = new List<Rule>() { 
    new Rule { Name="Rule1", Active = true, Weight = new Weight { Unit=1, Value=10} }, 
    new Rule { Name="Rule2", Active = false, Weight = new Weight { Unit=2, Value=3} }, 
    new Rule { Name="Rule3", Active = true, Weight = new Weight { Unit=1, Value=4} }, 
    new Rule { Name="Rule4", Active = true, Weight = new Weight { Unit=2, Value=2} }, 
    new Rule { Name="Rule5", Active = false, Weight = new Weight { Unit=1, Value=5} }, 
    new Rule { Name="Rule6", Active = true, Weight = new Weight { Unit=2, Value=4} }, 
}; 

await col.InsertManyAsync(data,new InsertManyOptions{ IsOrdered=true}); 
} 

public class Weight 
{ 
    public int Unit { get; set; } 
    public int Value { get; set; } 
} 

public class Rule 
{ 
    public ObjectId _id { get; set; } 
    public string Name { get; set; } 
    public bool Active { get; set; } 
    public Weight Weight { get; set; } 
} 
相关问题