【问题标题】:Mongodb group by dbref fieldMongodb按dbref字段分组
【发布时间】:2015-03-03 15:55:06
【问题描述】:

我需要按型号对产品进行分组。每个产品都有模型字段 - 模型集合的 DBRef。我尝试使用此聚合查询,但出现错误FieldPath field names may not start with '$'.

聚合查询:

db.Products.aggregate([
    { $project: { _id: 0, model: 1, isActive: 1 } },
    { $group: { _id: "$model.$id", actives: { $push: "$isActive" } }}
]);

产品文档示例:

{
    _id: ObjectId("54f48610e31701d2184dede5"),
    isActive: true,
    model: {
        $db: "database",
        $ref: "Models",
        $id: ObjectId("....")
    }
}

【问题讨论】:

    标签: javascript mongodb mapreduce aggregation-framework


    【解决方案1】:

    手册中曾经有一节明确指出聚合框架不支持 DBRef 以及其他各种 BSON 类型。

    google groups archive消息中所示的旧段落阅读:

    警告: 管道无法对以下类型的值进行操作:BinarySymbolMinKeyMaxKeyDBRefCode 和 @987654330 @。

    它可能还在某个地方,但我现在似乎找不到它:)

    在该消息线程中还提到,除了聚合框架不支持这一点之外,您的另一个选择(也是聚合的唯一真正选择)是使用 mapReduce 方法。以外壳为例:

    db.Products.mapReduce(
        function() {
            emit( this.model.$id, { "actives": [this.isActive] } );
        },
        function(key,values) {
            var result = { "actives": [] };
            values.forEach(function(value) {
                value.actives.forEach(function(active) {
                    result.actives.push( active );
                });
            });
        },
        { "out": { "inline": 1 } }
    )
    

    由于 mapReduce 结果的任意{ "_id": "", "value": { } } 结构,它看起来不太好,但它确实允许您正在寻找的那种聚合。

    也有提到这个 JIRA 问题:SERVER-14466,但我不会坚持在这方面有太多动静。

    因此您可以使用 mapReduce,但建议不要使用 DBRef,而是定义“手动引用”的替代形式,或者嵌入“集合”和“数据库”信息,或者依赖应用程序中此类事物的外部定义架构,取决于您的需要。只要您遵循相同的规则,您就可以将聚合框架用于具有有效属性名称的任何内容。

    【讨论】:

      猜你喜欢
      • 2013-08-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多