MongoDB mapReduce:将DBRef oid作为键发送

时间:2014-01-30 22:07:17

标签: mongodb mapreduce key

我需要维护一个存储在MongoDB中的数据的应用程序,并且我已经熟练使用mapReduce语法了。

我想进行mapReduce操作,其中发出的键是 DBRef ID ,而不是它的值。我清楚地从MongoDB documentation了解到,出于并行性原因,人们不能也不能访问数据库。

所以我的收藏文件是这样的:

{
  _id: "66f072b8-2422-4022-826b-b20b832a1ee6",
  _class: "com.foo.bar",
  foo_bar: 1,
  user: {
    "$dbref": {
      namespace: "user",
      oid: "6cd0dac5-a511-48b1-b437-318ad74061a5"
    }
  }
}

当前 mapReduce就是这样:

db.myCollection.mapReduce(
  function () {
      if (this.foo_bar > 0) {
          emit(this.user, this.foo_bar);
      }
  },
  function (key, values) {
      var sum = 0;
      for (var i = 0; i < values.length; i++) {
          sum += values[i];
      }
      return sum;
  },

  {
    "out" : { "inline" : 1} 
  }
)

有很多文档,AWS和MongoHQ之间的加载花费了大量时间。我希望能够使用 user $ id作为密钥,而不是DBRef的文档。

我已经测试了以下但没有成功:

  1. emit( this.user.id ,this.foo_bar);
  2. emit( this.user.oid ,this.foo_bar);
  3. emit( this.user._id ,this.foo_bar);
  4. 发射(的 this.user.dbref.id 下,this.foo_bar);
  5. emit( this.user.dbref.oid ,this.foo_bar);
  6. emit( this.user.dbref._id ,this.foo_bar);
  7. emit( this.user ['$ dbref']。oid ,this.foo_bar); (根据评论中的Sammaye建议)
  8. 正确的语法是什么?

1 个答案:

答案 0 :(得分:0)

我相信这里真正的答案是重新审视您的架构设计。值得注意的是,Spring数据方法更倾向于传统的关系设计,而不是MongoDB提供的动态文档结构。

那就是说,这里有一个link,有更多来自MongoDB社区经理的解释和备选方案。按照该回复中包含的注释和链接进行操作。

除了重新设计之外唯一的方法,这实际上只是实际进行重新设计的一种解决方法是使用输出 预加入数据从地图减少。这是一个渐进的步骤。生成的集合将允许您查询子文档的属性,而无需通过网络将每个文档向下拉。

另外请注意,类似的输出选项设置为在MongoDB的下一个版本中添加到Aggregation Framework管道。