【问题标题】:MongoDB groupby multiple times map twice before reduceMongoDB groupby 在reduce之前多次映射两次
【发布时间】:2011-03-17 22:30:11
【问题描述】:

我有一个事件集合=[timestamp, accountId, deviceId, rfid ...]

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

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

现在我按如下方式使用 linq 来获取我想要的数据集:

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()
});

【问题讨论】:

  • 我想要做的是将两个空间映射到 1(即 accountId、deviceId、rfid 和 accountId、deviceId、null => 相同的空间)有没有办法可以使用 '$or' 运算符在我的 emit() 函数中,尤其是在定义键时?

标签: c# linq mongodb map mapreduce


【解决方案1】:

必须对数据集进行两次 map/reduce 传递 1)map {acctid,deviceId,rfid} => 减少到数组[events] 2) (1) {acctId,deviceId} => 映射结果为基于 statusCode 的锁存 rfid 数组

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

【讨论】:

    【解决方案2】:

    嗯,不确定这是否是“从森林中看不到树”的问题。如果您按{deviceId, accountId} 分组,则该组中已经有空和非空 rfid。如果我理解正确,{deviceId, accountId} 有一个唯一的 rfid,如果是这样,只需从组中提取第一个非空 rfid 及其所有元素作为值:

    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 的组合。

    【讨论】:

    • 你好mmix,谢谢你的回复。我实际上有 linq 的东西在工作,问题是用 mongo 的 map/reduce 语法写这个,因为我现在正在移植它。基本上我需要我在 mongo 中的 map 函数将 S={{acctid,deviceid,rfid}, {acctid,deviceId,null}} 映射到相同的值集 V = {...}
    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2011-03-14
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多