MongoDB lists - get every Nth item

前端 未结 6 2376
太阳男子
太阳男子 2021-02-13 05:36

I have a Mongodb schema that looks roughly like:

[
  {
    \"name\" : \"name1\",
    \"instances\" : [ 
      {
        \"value\" : 1,
        \"date\" : ISODate         


        
6条回答
  •  忘掉有多难
    2021-02-13 06:02

    Unfortunately, with the aggregation framework it's not possible as this would require an option with $unwind to emit an array index/position, of which currently aggregation can't handle. There is an open JIRA ticket for this here SERVER-4588.

    However, a workaround would be to use MapReduce but this comes at a huge performance cost since the actual calculations of getting the array index are performed using the embedded JavaScript engine (which is slow), and there still is a single global JavaScript lock, which only allows a single JavaScript thread to run at a single time.

    With mapReduce, you could try something like this:

    Mapping function:

    var map = function(){
        for(var i=0; i < this.instances.length; i++){
            emit(
                { "_id": this._id,  "index": i },
                { "index": i, "value": this.instances[i] }
            );
        }
    };
    

    Reduce function:

    var reduce = function(){}
    

    You can then run the following mapReduce function on your collection:

    db.collection.mapReduce( map, reduce, { out : "resultCollection" } );
    

    And then you can query the result collection to geta list/array of every Nth item of the instance array by using the map() cursor method :

    var thirdInstances = db.resultCollection.find({"_id.index": N})
                                            .map(function(doc){return doc.value.value})
    

提交回复
热议问题