2015-04-02 125 views
1

我一直被困在這個問題上幾天了。我正在嘗試執行以下操作:如何獲取文檔集合中的所有嵌入項目?

請考慮以下與MongoDB中的文檔相對應的C#類。商家存儲在商家收藏中,並且都包含貨幣數組。

class Merchant 
{ 
    public string id {get;set;} 
    public List<Currency> MerchantCurrencies {get; set; } 
} 

class Currency 
{ 
    public string id {get; set; } 
    public string name {get; set; } 
    ... 
} 

現在,我想要做的就是返回所有商家的所有貨幣在一個單一的查詢與LINQ。因爲它們是基於它的SelectMany使用連接

var currencies = merchantCollection.AsQueryable() 
.SelectMany(m => m.MerchantCurrencies) 
.Where(ccy => ccy.CurrencyState == currencyStatus) 
.OrderBy(ccy => ccy.CurrencyName); 

var currencies= from merch in merchantCollection.AsQueryable() 
from ccy in merch.MerchantCurrencies 
select ccy 

然而,所有這些事情不工作:我已經試過類似的事情和的SelectMany多FROM子句,像這樣。 SelectMany的使用將拋出一個異常,因爲MongoDB C#驅動程序不支持它。

除了使用聚合框架/圖減少/多個查詢之外,是否有解決我的問題的方法?

我發現的唯一的解決辦法,就是:
1.讓所有商家
2.循環在商家
3.遍歷本國貨幣
4.添加貨幣到另一個列表變量

然而,我不喜歡這種方法,因爲如果它是一個巨大的集合,我必須得到所有的商業對象,這是一個非常昂貴的操作。

親切的問候

回答

0

您似乎正在嘗試使用的NoSQL數據庫來存儲關係數據,這可能不是一個好主意。如果你想堅持使用MongoDB,我會建議添加所有不同貨幣的新集合,並根據需要進行更新。

查看此鏈接到MongoDB documentation,其中描述了相同的問題。

MongoDB不支持連接,所以有時需要一些非規範化。 MongoDB集合不等同於關係表;每個都有獨特的設計目標。規範化的表格提供了一個原子的,孤立的數據塊。然而,文件更接近地代表整個對象。

+0

你好,感謝你的回答,但不幸的是,它不會工作。 SelectMany的內部實現使用連接來組合多個表。 MongoDB中不存在連接。 SelectMany的使用將在使用時引發異常。我已經試過那個。 – SVH 2015-04-02 12:05:20

+0

對不起,我錯過了關於你的問題的部分,涉及MongoDB中的連接。我相應地編輯了我的答案。 – prudentcoder 2015-04-02 14:16:27

0

聲明:我知道0對C#和LINQ

但是,做你想做的內置功能:distinct。每免責聲明我將在蒙戈外殼說明:

> db.test.drop() 
> db.test.insert({ "a" : [{ "a" :1 , "b" : 2 }, "op", 2, "3", "goop"] }) 
> db.test.insert({ "a" : [1,2, 3, "goop"] }) 
> db.test.distinct("a") 
[ 1, 2, 3, "goop", "3", "op", { "a" : 1, "b" : 2 } ] 
> db.test.distinct("a", { "a" : "op" }) 
[ 2, "3", "goop", "op", { "a" : 1, "b" : 2 } ] 

它做你的1-4,但在服務器端的,基本上是 - 不能有任何其他的方式來獲得的,除非工作文件的不同值已經部分完成了,因爲有索引。如果您在上面的示例中有{ "a" : 1 }的索引,distinct可以使用該索引通過索引掃描而不是集合掃描查找不同的值。

我認爲你想要的C#方法是this one

+0

你的答案似乎是合理的,但你知道如何進一步減少結果嗎?就像,當你收到這些區別時,我想進一步縮小例如。通過名字查詢它們。你知道如何做到這一點?所以像db.merchants.distinct(「merchantcurrencies」)。find({「name:}); – SVH 2015-04-03 09:14:17

相關問題