MongoDB当字段名称未知时,如何从子文档获取值

时间:2014-02-04 03:14:18

标签: mongodb mapreduce aggregation-framework

我正在尝试从一个或多个子文档中获取数据,但我不知道将保存子文档的字段的名称。以下是文档外观的一些示例。

  1. https://github.com/vz-risk/VCDB/blob/master/data/json/0C5DE044-B9B4-408D-9E65-D367EED12AB2.json
  2. https://github.com/vz-risk/VCDB/blob/master/data/json/064F5887-C2DA-4139-B3AA-D55906F8C30A.json
  3. 我想得到这些事件的动作变种,所以在第一个的情况下,我想获得action.malware.variety和action.social.variety。在第二个例子中,它将是action.hacking.variety和action.malware.variety。所以问题是我不知道哪个字段将保存子文档。它可能是黑客,恶意软件,社交,错误,滥用,物理和环境之一。

    所以我想放松那个字段并用键名做一些事情。这是可以通过聚合完成的事情还是我需要切换到mapReduce?

1 个答案:

答案 0 :(得分:3)

您似乎在谈论一个案例,您不确定所有黑客,社交或疟疾部分是否正确。我想您希望$project首先使用$ifNull运算符,如下所示:

db.stuff.aggregate([
    {$project: 
        { 
           hacking: {$ifNull: ["$action.hacking.variety",[null]]},
           social: {$ifNull: ["$action.social.variety",[null]]},
           malware: {$ifNull: ["$action.malware.variety",[null]]}
        }
   },
   {$unwind: "$hacking"},
   {$unwind: "$social"},
   {$unwind: "$malware"}
])

这应该为您提供每个值中包含某些内容的文档。 与您可能的任何值列表几乎相同。