[JAVA-2196] use mapReduce to get some document Created: 26/May/16  Updated: 11/Sep/19  Resolved: 26/May/16

Status: Closed
Project: Java Driver
Component/s: API
Affects Version/s: 3.2.2
Fix Version/s: None

Type: Task Priority: Major - P3
Reporter: km1218 Assignee: Unassigned
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

window7、eclipse(Mars Release (4.5.0))、jdk1.6.0_45



 Description   

I need to get a fixed number of doc by per group,when i use the method of mapReduce (class MongoCollection),it is so strange that the first doc have so many repeat keys.hope to get your answer,thank you very much.

the example code:

        String map="function (){emit(this.domain,{_id:this._id} )}";
		
		String reduce="function(key,values){ var str;for(var doc in values){"
				+ "              str=values[0];break;} return {\"docs\":str}; }";
		MapReduceIterable<Document> mri=collect.mapReduce(map, reduce);
		MongoCursor<Document> mc=mri.iterator();
		int n=0;
		while(mc.hasNext()){
			n++;
			Document doc=mc.next();
			System.out.println(doc.toJson());
		}

the output:

{ "_id" : "a.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "d113e8d2850f0944402f3129318a9043" } } } } } } } } } } } } } }
{ "_id" : "all-femdom-movies.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "3238cd2caf98bf7961089e36ca33a67b" } } } } } } } } } } } } } } } } } } } }
{ "_id" : "b.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "ad8200df9d862631a8e3420c3185e210" } } } } } } }
{ "_id" : "c.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "120eb8ade2d0665feb599748c3bd3c1d" } } } } } }
{ "_id" : "d.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "74d321593f289d25400ddfc712ddfa4b" } } } } } } } } } } } } }
{ "_id" : "e.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "c25bfbc7ea131affd9458680a40f7e18" } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }
{ "_id" : "f.example.com", "value" : { "docs" : { "docs" : { "_id" : "9343cff09d737eee511663898cd794cc" } } } }
{ "_id" : "g.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "ef1be6af33be28752a3998bc24d515fe" } } } } } } } } } } } } } } } } } } } } } } } } } } } }
{ "_id" : "h.example.com", "value" : { "docs" : { "_id" : "1f540dd64fd45200e5ed0d51a0551546" } } }
{ "_id" : "i.example.com", "value" : { "docs" : { "docs" : { "docs" : { "_id" : "5cc7831ac9b088987f5eb48e78ff0c46" } } } } }
{ "_id" : "j.example.com", "value" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "docs" : { "_id" : "e47a5c01101395d25ff36c2be3d7af1d" } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }

Edit: Sanitised the domain names in the example.



 Comments   
Comment by Ross Lawley [ 26/May/16 ]

Hi,

Just to let you know this project is for Java driver bugs or feature requests. The best place for questions regarding MongoDB usage or the Java driver specifics is the mongodb-user mailing list or stackoverflow as you will reach a boarder audience there. If your business requires an answer from MongoDB within a set time frame then we do offer production support.

I'm closing this as "Works as designed" because it is possible to invoke the reduce function more than once for the same key.

You need to update your reduce function so that the following properties are true:

  • the type of the return object must be identical to the type of the value emitted by the map function.
  • the reduce function must be associative. The following statement must be true:
    reduce(key, [ C, reduce(key, [ A, B ]) ] ) == reduce( key, [ C, A, B ] )
  • the reduce function must be idempotent. Ensure that the following statement is true:
    reduce( key, [ reduce(key, valuesArray) ] ) == reduce( key, valuesArray )
  • the reduce function should be commutative: that is, the order of the elements in the valuesArray should not affect the output of the reduce function, so that the following statement is true:
    reduce( key, [ A, B ] ) == reduce( key, [ B, A ] )

Please see the mapReduce documentation for more information.

Generated at Thu Feb 08 08:56:34 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.