如何在MongoDb和C#中编写多键查询?

时间:2012-03-14 15:03:01

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

在我们的Mongo数据库中,我们有一个由" StoreId"索引的集合。和" ItemId"。以下查询返回" In"中包含的所有产品商店组合(共9个文档)。名单。

var productQuery = Query.In("ItemId", new BsonArray(new List<int> {1, 2, 3}));
var storeQuery = Query.In("StoreId", new BsonArray(new List<int> {1, 2, 3}));
var queryToBringNineDocuments = Query.And(productQuery, storeQuery);

如何编写一个查询,在以下项目存储元组列表中将带有键的文档带回来?

var neededProductStores = new List<Tuple<int, int>>
{
    new Tuple<int, int>(1, 2),
    new Tuple<int, int>(1, 3),
    new Tuple<int, int>(2, 1),
    new Tuple<int, int>(3, 2)
};

var queryToBringFourDocuments = ?;

2 个答案:

答案 0 :(得分:4)

在我看来,目前只有一种方法 - 创建包含id和查询的额外字段

因此,在您存储到数据库的c#类中,您可以拥有:

public string ProductStoreId 
{
  get 
  {
     return string.Format("{0}_{1}",ItemId, StoreId);
  }
  set { } //empty set means that it will be stored to database
}

然后您的查询将是:

var query = Query.In("ProductStoreId", new BsonArray(new List<string> {"1_2", "1_3",.. }));

答案 1 :(得分:1)

这也可以通过累积AND查询的OR查询来完成。如果你有很多组合,它可能会变得非常难看。

var neededProductStores = new List<Tuple<int, int>>
                                {
                                    new Tuple<int, int>(1, 2),
                                    new Tuple<int, int>(1, 3),
                                    new Tuple<int, int>(2, 1),
                                    new Tuple<int, int>(3, 2)
                                };

  IMongoQuery[] queries =(from t in neededProductStores
       select Query.And(Query.EQ("ItemId", t.Item1), Query.EQ("StoreId", t.Item2))).ToArray<IMongoQuery>();
  var queryToBringFourDocuments = Query.Or(queries);