【问题标题】:How to refer to each property of an object in an array of objects in MongoDB MapReduce JavaScript query?如何在 MongoDB MapReduce JavaScript 查询中引用对象数组中对象的每个属性?
【发布时间】:2014-10-27 22:11:11
【问题描述】:

如何在MongoDB MapReduce JavaScript 查询中引用对象数组中对象的每个属性?

这是我的数据:

{
  "_id": ObjectId("544ae3de7a6025f0470041a7"),
  "name": "Bundle 4",
  "product_groups": [
    {
      "name": "camera group",
      "products": [
        {
          "$ref": "products",
          "$id": ObjectId("531a2fcd26718dbd3200002a"),
          "$db": "thisDB"
        },
        {
          "$ref": "products",
          "$id": ObjectId("538baf7c26718d0a55000043"),
          "$db": "thisDB"
        },
        {
          "$ref": "products",
          "$id": ObjectId("538baf7c26718d0a55000045"),
          "$db": "thisDB"
        }
      ]
    },
    {
      "name": "lens group",
      "products": [
        {
          "$ref": "products",
          "$id": ObjectId("531e3ce926718d0d45000112"),
          "$db": "thisDB"
        },
        {
          "$ref": "products",
          "$id": ObjectId("531e3ce926718d0d45000113"),
          "$db": "thisDB"
        }
      ]
    }
  ]
}

这是我的 map 函数:(为简单起见,我去掉了 reduce 选项,因为 map 不能正常工作并不重要)

var map = function() { emit(this.product_groups, this.product_groups.products); };
db.instant_rebates.mapReduce(
    map,
    {
        out: "map_reduce_example",
        query: {"_id": ObjectId("544ae3de7a6025f0470041a7")}
    }
);

但问题是结果中的“值”字段始终显示为“未定义”。为什么?为什么 this.product_groups.products 不返回 products 数组?我该如何解决?

另外,我希望它为两个 product_group 中的每一个发出两次。但到目前为止它只发出一次。我该如何解决?

【问题讨论】:

    标签: javascript mongodb mapreduce mongodb-query


    【解决方案1】:

    在 mapReduce 操作下,文档以 JavaScript 对象的形式呈现,因此您需要将它们视为 JavaScript 对象并遍历它们。这意味着处理数组的每个成员:

    var map = function() { 
        this.product_groups.forEach(function(group) {
            emit( group.name, { products: group.products } );
        });
    };
    var reduce = function(){};
    
    db.instant_rebates.mapReduce(
        map,
        reduce,
        {
            out: "map_reduce_example",
            query: {"_id": ObjectId("544ae3de7a6025f0470041a7")}
        }
    );
    

    “emit”函数的要求是“key”和“value”都作为参数呈现,并被发出。 “值”必须是单数,因此要发出一个数据“数组”,您需要将其包装在对象的属性下。 "key" 必须是一个奇异值,因为它打算用作 reduce 操作中的"分组键",并且"name" 字段至少应该足够。

    自然地,由于文档中有一个顶级数组,您处理“每个元素”就像使用函数一样,然后每个结果都被“发出”,因此从这个文档发出“两个”结果。

    您还需要至少定义一个“reduce”函数,即使它永远不会被调用,因为所有发出的键都不同,就像这里的情况一样。

    所以,它是 JavaScript。将列表结构视为列表。

    请注意。这就是你的问题。如果您想在 mapReduce 上提出更多问题,请提出其他问题。不要再问这个了。我不想谈论您的字段命名,也不想详细说明这似乎是如何朝着“我如何从其他集合中提取数据”工作的,这是您无法做到的。

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2012-03-26
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多