MongoDB MapReduce使用
MongoDB MapReduce使用
一书生 发表于2年前
MongoDB MapReduce使用
  • 发表于 2年前
  • 阅读 73
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

摘要: 学习MongoDB的MapReduce,记录一下步骤。

项目中需要实现一个分组(GROUP BY)功能,具体逻辑为:
MongoDB中有一个标签(tags)集合,记录了所有标签,当标签被用户使用后,就与特定用户关联(也就是将用户的Id记录到标签上)。要统计标签集合中的各个用户使用的标签列表,可以使用MongoDB的MapReduce方式。

MongoDB的MapReduce命令如下:

db.collection.mapReduce(
	<map>, 
	<reduce>, 
	{
		out: <collection>, 
		query: <document>, 
		sort: <document>, 
		limit: <number>, 
		finalize: <function>,
		scope: <document>,
		jsMode: <boolean>,
		verbose: <boolean>,
		bypassDocumentValidation: <boolean>
	}
)

具体请参考:
https://docs.mongodb.com/manual/reference/method/db.collection.mapReduce/#db.collection.mapReduce

需要实现一个分组的查询:使用MongoDB的MapReduce统计tags集合中用户拥有的标签Id集合。

第一步:创建Map函数

var mapFunction = function() {
	emit(this.userId, this.tagId);
}

注:map函数中的emit函数有两个参数:第一个参数为key,即分组的字段;第二个参数为value,即要统计的字段。

第二步:创建Reduce函数

var reduceFunction = function(key, values) {
	return {userId:key, tagIds:values};
}

第三步:创建执行命令

db.tags.mapReduce(
	mapFunction, 
	reduceFunction, 
	{
		out: "userTags",
		query: {"userId": {"$ne": "0"}}
	}
);

db.userTags.find();

第四步:查看执行结果

MapReduce执行的结果集为:

/* 1 */
{
    "result" : "userTags",
    "timeMillis" : 214.0,
    "counts" : {
        "input" : 29,
        "emit" : 29,
        "reduce" : 3,
        "output" : 4
    },
    "ok" : 1.0,
    "_o" : {
        "result" : "userTags",
        "timeMillis" : 214,
        "counts" : {
            "input" : 29,
            "emit" : 29,
            "reduce" : 3,
            "output" : 4
        },
        "ok" : 1.0
    },
    "_keys" : [ 
        "result", 
        "timeMillis", 
        "counts", 
        "ok"
    ],
    "_db" : {
        "_mongo" : {
            "slaveOk" : true,
            "host" : "192.168.8.225:27017",
            "defaultDB" : "",
            "_readMode" : "commands"
        },
        "_name" : "oncemore"
    },
    "_coll" : {
        "_mongo" : {
            "slaveOk" : true,
            "host" : "192.168.8.225:27017",
            "defaultDB" : "",
            "_readMode" : "commands"
        },
        "_db" : {
            "_mongo" : {
                "slaveOk" : true,
                "host" : "192.168.8.225:27017",
                "defaultDB" : "",
                "_readMode" : "commands"
            },
            "_name" : "oncemore"
        },
        "_shortName" : "userTags",
        "_fullName" : "oncemore.userTags"
    }
}

分组后返回的结果集为:

/* 1 */
{
    "_id" : "65df12b2-75e3-46d7-8ac0-932ef38c49d1",
    "value" : {
        "userId" : "65df12b2-75e3-46d7-8ac0-932ef38c49d1",
        "tagIds" : [ 
            "X$HUS11EY2BUJ95R.-N$KEFF", 
            "I-Z5FQHQ5S2I3A70I9SE212F", 
            "58$.$IQHBSB2HI96LIY9Q7VF"
        ]
    }
}

/* 2 */
{
    "_id" : "78768970-7e45-484a-961e-2ebf47f80f51",
    "value" : {
        "userId" : "78768970-7e45-484a-961e-2ebf47f80f51",
        "tagIds" : [ 
            "RO31AJ6N13IW1YI5ZS9KQ56F", 
            "E1F277.91604M5LI65*E**YF"
        ]
    }
}

/* 3 */
{
    "_id" : "7b5b8bd0-418f-4883-9dee-90e72c56a2b3",
    "value" : "8*O.AW3JY2X.AV1EZJ8G4MQF"
}

/* 4 */
{
    "_id" : "b3bd051a-eb0c-467d-97d2-15a6dc1ceb3d",
    "value" : {
        "userId" : "b3bd051a-eb0c-467d-97d2-15a6dc1ceb3d",
        "tagIds" : [ 
            "NUVA661$MT6M5IT8M$2SUK5F", 
            "KPR.GANUMTYMWRZ92MRAMV6F", 
            "EP6IE3SA0LYFWO9FTYC59OJF", 
            "W-MVECY-VP*7A80WSTZ*LPWF", 
            "7TEP*8SNJNSDL95H.32BZV2F", 
            "VACQEI*FI16INZ73UW6MU3SF", 
            "W3.872XTD6PAI$EIJRY4JBOF", 
            "PEANQXC10BK0F9EJSUT.-67F", 
            "0I$W.DGYBIRXSEQ26QZA0$OF", 
            "7ODQH9C$V66ZFYFLHGZ590-F", 
            "IW58QNPZ.U8WTE1QR5KL9M7F", 
            "QEYG1IJ2EPCNLIHSAE60KYQF", 
            "2KXOZUSJH*XXIZ550OKGHESF", 
            "-D3.-ZXPV.5-K8KW3*PQRN3F", 
            "NUE0W.87P7IVQOT.A1HDN57F", 
            "58.7*CS.Z8ELR3POWY7AQ83F", 
            "5XXORWJ3Z30JXJ96HLATL8TF", 
            "AC63$FTDMMLNRTLR$B60JH$F", 
            "SM73UGZ6SO2JXRWP*0SZNJQF", 
            "AZ8BQ6ADNDZHWY$9PYKJ$V2F", 
            "5XJ27WQSOA4BHO.WQALRD3OF", 
            "3BU98-6K8KHM4UMXENEM647F", 
            "30-9.7E151$O5QRB0XTOMY6F"
        ]
    }
}

可以看出,返回的分组结果集中包含用户的userId以及该用户使用标签的列表。以上示例只是MongoDB MapReduce的一个简单的使用,顺便记录了一下自己使用MongoDB MapReduce的使用步骤。

标签: MongoDB MapReduce
共有 人打赏支持
粉丝 3
博文 13
码字总数 5030
×
一书生
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: