2012-03-14 33 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個數組的內容? MongoDB只能返回文檔,而不是「子文檔」。 – 2012-03-14 18:48:30

+0

對於每個商品組合,我有9個單獨的文檔。我需要獲得這些文件的一個子集。我可以在多個查詢中做到這一點,但想知道是否有單一查詢的方式。 – derdo 2012-03-14 20:05:42

回答

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查詢日完成積累和查詢。不過,如果你有很多組合,它會變得非常難看。

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); 
相關問題