从属性组合中获取所有文档

时间:2017-01-19 09:52:40

标签: c# .net mongodb mongodb-query mongodb-.net-driver

这可能很简单,但我很难搞清楚:

我有一个List<Tuple<String, String>>,其中包含我需要搜索的产品列表,我希望在一个请求中获取该列表中所有产品的所有文档。

Item1是该产品的SKU,但由于可能存在重复的SKU,我还有Item2,其中包含应查找的哪个SupplierId。

我的挑战是使用MongoDB C#驱动程序构建查询,以获取数据,任何可以提供帮助的人?

我正在使用新的2.3.0驱动程序版本,该版本对此主题没有太多帮助。

这是我到目前为止的代码:

var collection = _database.GetCollection<StockDoc>("stock");
var result = collection.Find().ToListAsync().Result;

1 个答案:

答案 0 :(得分:1)

我假设您的StockDoc类为:

public class StockDoc
{
    public ObjectId Id { get; set; }
    public string SKU { get; set; }
    public string SupplierId { get; set;}
}

我会编写一个帮助方法,为列表中的每个元组创建过滤器(它和过滤器:SKU = Item1 && SupplierId == Item2):

public FilterDefinition<StockDoc> BuildFilter(Tuple<String, String> p) 
{
    return Builders<StockDoc>.Filter.And(
                Builders<StockDoc>.Filter.Eq(x=>x.SKU, p.Item1),
                Builders<StockDoc>.Filter.Eq(x=>x.SupplierId, p.Item2) );
}

之后,您可以构建一个Or过滤器,以便从列表中获取所有元组的项目:

var p = new List<Tuple<String, String>> { 
       Tuple.Create("a", "1"), 
       Tuple.Create("b", "1"), 
       Tuple.Create("d", "2")};

var filter = Builders<StockDoc>.Filter.Or(p.Select(BuildFilter));

之后,您可以使用此过滤器获取数据:

collection.Find(filter).ToList()