【问题标题】:MongoDB How to get value from subdocument when field name is unknownMongoDB如何在字段名称未知时从子文档中获取值
【发布时间】:2014-02-04 03:14:17
【问题描述】:

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

  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

我想获得这些事件的动作变体,所以对于第一个事件,我想获得 action.malware.variety 和 action.social.variety。在第二个示例中,它将是 action.hacking.variety 和 action.malware.variety。所以问题是我不知道哪个字段将保存子文档。它可能是黑客攻击、恶意软件、社交、错误、误用、物理和环境中的一种。

所以我想 $unwind 该字段并使用键名做一些事情。这是可以通过聚合完成的事情,还是我需要切换到 mapReduce?

【问题讨论】:

  • 使用聚合框架很难做到,因为你只能展开对象数组。在示例 json 中,action 属性只是一个对象,而不是对象数组。所以这里不能放松。如果重构架构可以吗?还请告诉我您真正希望如何显示输出。
  • 这实际上是一个公平的问题,因为并不是每个人都知道 $ifNull 和 $cond 在聚合投影中的用途
  • @cj0809 您可能想查看已接受的答案,该答案演示了您观察到的问题。

标签: mongodb mapreduce aggregation-framework


【解决方案1】:

您似乎在谈论一个您不确定所有黑客、社交或恶意软件部分是否正确的案例。我认为您希望 $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"}
])

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

【讨论】:

    猜你喜欢
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多