【问题标题】:Matching on compound _id fields in MongoDB aggregate匹配 MongoDB 聚合中的复合 _id 字段
【发布时间】:2013-07-23 22:24:12
【问题描述】:

我是 MongoDB 新手,如果这个问题有明确的答案,请见谅...

上下文:

我遵循example in the MongoDB docs 使用map-reduce 实现分层聚合。该示例使用“复合”_id 字段作为 map-reduce 键,生成这样的聚合文档...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

这一切都很好。我的特定用例要求每个map 步骤发出几个相似键的值。比如……

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), hobby: "wizardry" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), gender: "male" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

(值相同,但_id 键略有不同。)

这也很好。

问题:

现在我想汇总我的分层集合(视图),其中包含具有多个不同复合 _id 字段的文档,但仅限于具有 $matching _id 字段的文档。例如,我想只聚合具有{u: String, d: Date, hobby: String} 类型_id 的文档或仅聚合具有_id 类型{u: String, d: Date} 的文档。

我知道我可以使用 $exists 运算符来限制应该和不应该允许哪些 _id 字段,但我不想为每个 _id 创建单独的聚合(可能很多)。

是否有一种简单的方法以编程方式将 $matching 文档限制为包含(或不包含)聚合中特定字段的文档?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    我认为解决此问题的最佳方法是以不同方式存储数据。您的“_id”类型具有任意值作为键,这是您应该避免的。我可能会将文档存储为:

    {
        _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: hobby, value: "wizardry" }
    }
    {
        _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: gender, value: "male" },
    }
    

    然后您的匹配因为简单,甚至无需为每种类型创建不同的匹配。

    【讨论】:

    • 很公平,但是如果我必须仅根据_id 字段进行匹配呢?
    • 就我而言,_id 字段并不像我在这里所说的那么简单(例如,由单个字段不同)。我的问题是如何根据_id 字段中存在(和不存在)的字段来$match(可能使用$exists 运算符),而不必枚举所有可能的字段组合。因此,如果提供了一个_id“模板”,我想只是在具有与模板匹配的_id 字段的文档上进行聚合。
    • 你为什么要把所有这些东西都放在 _id 中?
    • 这是 map-reduce 过程的结果。
    • 我认为您应该全面了解您正在尝试做的事情,因为我只看到一小部分 - 这不是提供支持的好基础!
    猜你喜欢
    • 2020-12-10
    • 2016-08-16
    • 2021-08-08
    • 2017-05-18
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多