我需要维护一个存储在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的文档。
我已经测试了以下但没有成功:
正确的语法是什么?
答案 0 :(得分:0)
我相信这里真正的答案是重新审视您的架构设计。值得注意的是,Spring数据方法更倾向于传统的关系设计,而不是MongoDB提供的动态文档结构。
那就是说,这里有一个link,有更多来自MongoDB社区经理的解释和备选方案。按照该回复中包含的注释和链接进行操作。
除了重新设计之外唯一的方法,这实际上只是实际进行重新设计的一种解决方法是使用输出 预加入数据从地图减少。这是一个渐进的步骤。生成的集合将允许您查询子文档的属性,而无需通过网络将每个文档向下拉。
另外请注意,类似的输出选项设置为在MongoDB的下一个版本中添加到Aggregation Framework管道。