如何在文档集合中获取所有嵌入项?

时间:2015-04-02 08:57:36

标签: c# linq mongodb

我已经在这个问题上坚持了几天了。我试图做以下事情:

考虑以下与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这样的东西和多个from子句,比如:

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。 SelectMany的使用将引发异常,因为MongoDB C#驱动程序不支持它。

除了使用聚合框架/地图缩减/多个查询之外,我的问题是否有任何解决方案?

我找到的唯一解决方案是:
1.吸引所有商家 2.遍布商家
3.循环其货币
4.将货币添加到另一个列表变量

但是,我不喜欢这种方法,因为如果它是一个庞大的集合,我必须得到所有商家对象,这是一项相当昂贵的操作。

亲切的问候

2 个答案:

答案 0 :(得分:0)

您似乎正在尝试使用NoSQL数据库来存储关系数据,这可能不是一个好主意。如果您想坚持使用MongoDB,我建议您添加所有不同货币的新集合并根据需要进行更新。

查看此MongoDB documentation的链接,该链接描述了同样的问题。

  

MongoDB不支持连接,因此有时需要一些非规范化。 MongoDB集合不等同于关系表;每个都有一个独特的设计目标。规范化表提供原子的,孤立的数据块。但是,文档更接近于整个对象。

答案 1 :(得分:0)

免责声明:我知道0关于c#和LINQ

但是,有一个内置函数可以执行您想要的操作:distinct。根据免责声明,我将在mongo shell中说明:

> 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