2014-08-27 184 views
1

我目前有一个Customers和一个Products集合... 客户包含订阅列表,订阅包含ProductId。 我正在尝试创建一个索引,使我可以只选择未在订阅中使用的产品ID,以便我可以删除它们。Raven从另一个集合的数据过滤数据集合

我只管理到目前为止创建一个索引来检索订阅中使用的productIds。 我已经看过多个地图缩小例子甚至一些转换,但似乎没有任何意义。

任何想法?

谢谢!

回答

2

好的...所以它终于打到了我。 这就是我所做的: 我构建了2个地图,一个用于Products集合,另一个用于Customers集合,我选择了产品ID并创建了一个名为Usage的附加属性。产品集合中的产品的用途设置为0,客户 - >订购中的产品的用途设置为1。 在reduce中,我通过使用总和进行过滤以仅获取未使用的产品(sum = 0)。 参见下文代码:

地图:

from prod in docs.Products 
select new 
{ProductId = prod.ExternalId, 
Usage = 0 
} 
from customer in docs.Customers 
from docSubscriptionsItem in ((IEnumerable<dynamic>)customer.Subscriptions).DefaultIfEmpty() 
select new { ProductId = docSubscriptionsItem.ProductId, 
Usage=1} 

减少:

from result in results 
group result by result.ProductId 
into g 
let sum = g.Sum(p=>p.Usage) 
where sum == 0 
select new 
{ProductId=g.Key, Usage = sum} 

希望这可以帮助别人!

+1

我会建议从reduce中删除where子句。然后,您可以离开用户== 0的位置在客户端。然后,这会给出一个索引,以便为您提供有关系统的其他信息,而不是将其限制为1个特定用途。 – 2014-08-28 18:16:36

+0

确实。你是对的!感谢那 :) – Bianca 2014-09-01 07:28:21

相关问题