我正在尝试从一个或多个子文档中获取数据,但我不知道将保存子文档的字段的名称。以下是文档外观的一些示例。
我想得到这些事件的动作变种,所以在第一个的情况下,我想获得action.malware.variety和action.social.variety。在第二个例子中,它将是action.hacking.variety和action.malware.variety。所以问题是我不知道哪个字段将保存子文档。它可能是黑客,恶意软件,社交,错误,滥用,物理和环境之一。
所以我想放松那个字段并用键名做一些事情。这是可以通过聚合完成的事情还是我需要切换到mapReduce?
答案 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"}
])
这应该为您提供每个值中包含某些内容的文档。 与您可能的任何值列表几乎相同。