【发布时间】:2015-11-19 12:50:33
【问题描述】:
我有一个与其他集合有关系的集合,我想为用户选择一个最相关的记录选择如下:
具有 this.some_collection_id == 'someid' && this.another_collection_id == 'another_id' 的第一条记录 然后记录有 this.some_collection_id == 'someid' 然后记录有 this.another_collection_id == 'another_id' 然后是其他记录
示例:假设主要集合是故事,每个故事都有一个“兴趣组”和一个“位置”。所有用户都有一个“主要兴趣组”和一个“位置”。我想查询特定用户的前 100 个最有趣的故事,具有相同兴趣组和位置的故事应权重 5,相同兴趣组仅 3,相同位置仅 2,其余 1。
我想在查询期间奖励这些积分,以便我可以根据这些积分对故事集进行排序并返回前 100 名。
所以我可以执行 4 个单独的查询并在客户端合并结果(不是那么漂亮),或者我可以尝试以正确的顺序获取集合。
到目前为止,我想出了以下几点:
map = %Q{
function() {
var score = 1;
if (this.some_id == "#{some_id}") {
score = score + 3
}
if (this.another_id == "#{another_id}") {
score = score + 2
}
emit(this._id, { _id: this._id, score: score });
}
}
reduce = %Q{
function(key, values) {
return values;
}
}
MyCollection.map_reduce(map, reduce).out(inline: true)
这将正确返回带有分数的整个记录集合,但是我无法对分数进行排序,所以我必须在客户端进行(也很难看,因为我只需要前 100 条左右的记录)
有没有办法以不同的方式做到这一点?我还检查了聚合框架,但我不知道这将如何解决这个特定的查询。
【问题讨论】:
-
这个问题有点笼统,这是没有人接触它的最大原因。您至少可以编辑以显示一些示例文档(仅几个)以及应该与所需结果匹配的内容。这将极大地帮助理解。
-
谢谢,让我尝试添加一些相关数据
-
请做。我想我明白你的意思,但我想确定一下。
-
实际上是希望获得一些具有值的真实数据,而不是您刚刚添加的数据。但以下至少与您提供的代码类似。
标签: ruby mongodb mapreduce mongodb-query aggregation-framework