2012-03-14 11 views
4

Mongoデータベースには、 "StoreId"と "ItemId"で索引付けされたコレクションがあります。次のクエリは、 "In"リストに含まれる製品ストアのすべての組み合わせ(合計9つのドキュメント)を返します。MongoDbとC#でマルチキークエリを書くにはどうしたらいいですか?

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 = ?; 
+0

ここでは、4つのドキュメントまたはその中に4つのアイテムの配列を持つ1つのドキュメントを明確にできますか? MongoDBは "サブドキュメント"ではなくドキュメントのみを返すことができます。 –

+0

私はitem-storeの各組み合わせに対して9つの別々の文書を持っています。私はそれらの文書のサブセットを取得する必要があります。私は複数のクエリでこれを行うことができますが、単一のクエリで方法があるかどうか疑問に思っています。 – derdo

答えて

4

唯一の方法は現在存在しているように私には思える - あなたが持つことができますが、データベースに格納し、あなたのC#クラスにそうそれに

をIDとクエリの両方が含まれています余分なフィールドを作成します。

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

また、これはORクエリ番目に行うことができますで累積ANDクエリ。あなたが多くの組み合わせを持っているなら、それはかなり醜いかもしれません。

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); 
関連する問題