【问题标题】:MongoDB limit mapReduce on index keyMongoDB在索引键上限制mapReduce
【发布时间】:2015-06-24 14:17:38
【问题描述】:

是否可以限制输入文档,而不是在它们的数量上,而是在索引键的映射上。喜欢:

{_id: 1, key: 5, smthFresh: "Cool"}
{_id: 2, key: 5, smthFresh: "Cool"}
{_id: 3, key: 5, smthFresh: "Cool"}
{_id: 4, key: 6, smthFresh: "Cool"}
{_id: 5, key: 6, smthFresh: "Cool"}
{_id: 6, key: 7, smthFresh: "Cool"}

现在我想将 mapReduce 的输入限制为两个不同的键。就像拥有与前两个键匹配的所有文档,即 5 和 6。这将返回 5 个文档,而不是前 2 个。

关于 mapreduce 限制的 MongoDB 文档:

限制数可选。指定文件的最大数量 输入到地图函数中。

有没有办法做到这一点,而不首先映射所有键,然后在第二个查询中使用最后两个?

【问题讨论】:

  • 可以在map reduce命令中添加queryquery: { key : { $in: [5, 6] }}
  • 我事先不知道我需要哪一个。我需要最后一组或第一组。

标签: mongodb mapreduce


【解决方案1】:

要将 mapReduce 的输入限制为两个不同的键,即所有文档都与前两个键(即 5 和 6)匹配,您可以在 mapReduce 命令中添加一个查询字段,以仅选择那些具有相同键的文档5或6如下:

db.collection.mapReduce( 
    mapFunction,
    reduceFunction,
    {
        "query": { 
            "key": { "$in": [5, 6] }
        }
    }
)

-- 编辑--

要获取前两个键,您可以使用 distinct() 方法从集合中的所有文档中返回字段 key 的不同值并使用 JavaScript @987654322 @ 方法从数组中返回前两个键:

var keys = db.test.distinct("key").slice(0, 2);
db.collection.mapReduce( 
    mapFunction,
    reduceFunction,
    {
        "query": { 
            "key": { "$in": keys }
        }
    }
)

【讨论】:

  • 这也是@orid 的建议。但我不想要 5 和 6,我想要前两个,无论它们是什么。我可以用另一个返回 [5, 6] 的查询来做到这一点,但我想知道是否有另一种奇特的方式。
  • @alknows 我已经用一种可以事先为您提供密钥的方法更新了答案。
  • 谢谢,您的解决方案一点也不差。问题是这必须是一个单一的查询。因为总体上最新的键可能与它将生成的 map-reduce 查询的最新键不匹配。示例:[5, 6] 是不同的前两个。现在我在查询_id:{$gt:3}中输入mapreduce。我坚持 [5,6] 但现在只有 6 个有效,并且由于查询是动态的,因此应该包含 7 个。
  • @alknows 不确定单个查询是否可行。你不能像var keys = db.test.distinct("key", {"_id": {"$gt": 3}}).slice(0, 2);那样查询不同的方法吗
  • 问题在于性能。这些查询往往有些复杂,执行两次并不是最佳的。似乎没有更好的解决方案,所以我会接受你的。谢谢@chridam
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2021-10-03
  • 1970-01-01
  • 2018-10-27
  • 2011-08-26
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多