首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在reduce之前,MongoDB groupby多次映射两次

在reduce之前,MongoDB groupby多次映射两次
EN

Stack Overflow用户
提问于 2011-03-18 06:30:11
回答 2查看 723关注 0票数 1

我收集了events=时间戳,accountId,deviceId,RFID...

-rfids可以为空,但其他所有内容都不能为空。-the通过deviceId生成rfid报告。

我需要找到我系统里每个rfid的状态。乍一看,如果我们映射到{accountId,deviceId,rfid}上,这似乎微不足道,然而,rfid的状态也依赖于报告的deviceIds事件。当设备报告时,它会将RFID值设置为null (例如,设备可能会重新启动)。如何基于{accountId,deviceId,rfid}定义单个映射函数,然后将地图集合与所有{accountId,deviceId,null}映射集合统一起来?

现在我使用linq获取我想要的数据集,如下所示:

代码语言:javascript
复制
events.GroupBy(new{deviceId, accountId}).Select( x=>new{
  Key= x.Key
  Value = x.GroupBy(y=>new{y.accountId, y.rfid}).Union(x.Where(z=>z.rfid== null))).ToList()
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-19 07:52:15

必须对数据集进行两次映射/还原1)映射{acctid,deviceId,rfid} => reduce to arrayevents 2)将(1) {acctId,deviceId} => reduce的结果映射为基于statusCode的锁存rfid数组

这里要记住的关键一点是,emit函数的值参数(第二个参数)应该与结果集具有相同的结构。这是因为reduce是迭代执行的!!这是生成初始事件数组时的一个痛点。

票数 1
EN

Stack Overflow用户

发布于 2011-03-18 19:24:07

好吧,我不确定这是不是“从森林里看不到树”之类的问题。如果按{deviceId, accountId}分组,则组中已有null和非NULL rfids。如果我理解正确的话,{deviceId,accountId}有一个唯一的rfid,如果是这样,只需从组中提取第一个非null rfid及其所有元素作为值:

代码语言:javascript
复制
var p = from e in events 
    group e by new { e.accountId, e.deviceId } into g
    let rfid = g.First(ge => ge.rfid != null).rfid
    select new { 
        Key = new { g.Key.accountId, g.Key.deviceId, rfid }, 
        Values = g.ToList() 
    };

另一方面,如果你的设备,帐户组合可以有多个rfid,那么你就没有一个合理的解决方案,因为空的rfid可能属于任何帐户,设备,rfid组合。

注意:要使其正常工作,您必须在每个组合中至少有一个非空的rfid,否则First()将崩溃并烧毁。再说一次,如果你在combe中没有非空的rfid,那么首先没有办法知道它是什么,一种选择是使用FirstOrDefault,但然后你会得到多个空键,每个帐户一个,没有rfid的设备组合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5346062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档