当前位置: 首页 > 面试题库 >

MongoDB MapReduce函数中的查询

冯驰
2023-03-14
问题内容

我已经流式传输了大约25万条推文并将其保存到MongoDB中,在这里,我正在检索它,如您所见,基于推文中出现的单词或关键字。

Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("TwitterData");
DBCollection collection = db.getCollection("publicTweets");
BasicDBObject fields = new BasicDBObject().append("tweet", 1).append("_id", 0);
BasicDBObject query = new BasicDBObject("tweet", new BasicDBObject("$regex", "autobiography"));
DBCursor cur=collection.find(query,fields);

我想做的是使用Map-
Reduce并基于关键字进行分类,并将其传递给reduce函数以计算每个类别下的tweet数量,有点像您在这里可以看到的。在该示例中,他正在计算页面数,因为它是一个简单的数字。我想做类似的事情:

"if (this.tweet.contains("kword1")) "+
"category = 'kword1 tweets'; " + 
"else if (this.tweet.contains("kword2")) " + 
"category = 'kword2 tweets';

然后使用reduce函数来获取计数,就像在示例程序中一样。

我知道语法不正确,但这几乎是我想要做的。有什么方法可以实现?谢谢!

PS:哦,我在用Java编写代码。因此,Java语法将受到高度赞赏。谢谢!

发布的代码的输出如下所示:

{ "tweet" : "An autobiography is a book that reveals nothing bad about its writer except his memory."}
{ "tweet" : "I refuse to read anything that's not real the only thing I've read since biff books is Jordan's autobiography #lol"}
{ "tweet" : "well we've had the 2012 publication of Ashley's Good Books, I predict 2013 will be seeing an autobiography ;)"}

当然,这适用于所有带有“自传”一词的推文。我想在map函数中使用它,将其归类为“自传推文”(以及其他关键字),然后将其发送到reduce函数以计算所有内容并返回带有in单词的推文数量它。

就像是:

{"_id" : "Autobiography Tweets" , "value" : { "publicTweets" : 3.0}}
{"_id" : "Biography Tweets" , "value" : { "publicTweets" : 15.0}}

问题答案:

您可能要尝试以下操作:

    String map = "function() { " +
                 "    var regex1 = new RegExp('autobiography', 'i'); " +
                 "    var regex2 = new RegExp('book', 'i'); " +
                 "    if (regex1.test(this.tweet) ) " +
                 "         emit('Autobiography Tweet', 1); " +
                 "    else if (regex2.test(this.tweet) ) " +
                 "         emit('Book Tweet', 1); " +
                 "    else " +
                 "       emit('Uncategorized Tweet', 1); " +
                 "}";

    String reduce = "function(key, values) { " +
                    "    return Array.sum(values); " +
                    "}";

    MapReduceCommand cmd = new MapReduceCommand(collection, map, reduce,
             null, MapReduceCommand.OutputType.INLINE, null);
    MapReduceOutput out = collection.mapReduce(cmd);

    try {
        for (DBObject o : out.results()) {

            System.out.println(o.toString());

       }
    } catch (Exception e) {
        e.printStackTrace();
    }


 类似资料:
  • 问题内容: 我正在使用northwind数据库通过创建一些或多或少复杂的查询来刷新我的SQL技能。不幸的是,我找不到最后一个用例的解决方案:“获得1997年每个类别的五个最大订单的总和。” 涉及的表是: 我尝试了以下查询 好吧……原来,子查询在聚合函数中是不允许的。我已经阅读了有关此问题的其他文章,但是找不到针对我的特定用例的解决方案。希望你能帮我… 问题答案: 聚合函数中通常不允许使用子查询。相

  • 我想在我的查询中调用一个函数。例如: 在我的myTableRepository中,我可以执行以下操作: 但向语句添加函数调用不起作用: 有没有办法让它在JPQL中工作? 我的错误:

  • 我正在为Discord制作一个机器人,这个机器人的一个功能是一个级别系统。我决定从使用JSON存储数据转向使用sqlite。我正在node.js中使用sqlite3,并试图创建一个函数来创建/检索播放器的数据。我的目标是让这个函数返回查询中的数据,但我正在努力找出我做错了什么。我已经读到,我需要使用发送到查询函数的回调,但这对我来说也不起作用(对于这个函数的目标也不起作用)。 因此,任何关于如何创

  • 问题内容: 我可以在SQL Server 2008的Function中编写插入查询吗?如果尝试,会在函数中收到无效使用副作用运算符’INSERT’的错误。请帮帮我。但我希望它是一个函数,而不是存储过程 问题答案: 从这里引用: 用户定义的函数不能用于修改基表信息。DML语句INSERT,UPDATE和DELETE不能在基表上使用。 因此,您无法在函数中执行INSERT。 您可能想解释为什么不想使用

  • 我有一个函数,在这个函数中,我在一个*args函数参数中接收到一个可变数量的参数,我必须添加它们。基于这个总和,我必须检查一些条件: 如果两者之和小于21,则打印 如果和大于21,则每11个值从和中减去10,如果减去所有值后和仍然大于21,则打印“no good” 如果和是21,并且我有一个10值和一个11值,打印“win”。 这是我能想到的,但第一手后,它只是打印“不好”

  • 关于执行查询的信息 $this->db->insert_id() 当执行 INSERT 语句时,这个方法返回新插入行的ID。 注解 If using the PDO driver with PostgreSQL, or using the Interbase driver, this function requires a $name parameter, which specifies the