简体   繁体   English

无法“跳过”猫鼬子文档

[英]unable to “skip” mongoose sub-documents

I am using mongoose and node and I am trying to paginate data from sub-documents. 我正在使用猫鼬和节点,并且试图从子文档中分页数据。 I am able to limit subdocuments, but not skip them. 我可以限制子文档,但不能跳过它们。

The versions I am using are: 我使用的版本是:

Mongo 3.0.0 蒙戈3.0.0

Node 0.10.33 节点0.10.33

Mongoose 3.9.7 猫鼬3.9.7

The Data 数据

[{ 
    "name" : "Ranger Table", 
    "_id" : ObjectId("550234d3d06039d507d238d8"),
    "body" : [ 
        { 
            "name" : "Jason", 
            "colour" : "Red", 
            "animal" : "T-rex", 
            "_id" : ObjectId("550234d3d06039d507d238de") 
        }, 
        { 
            "name" : "Billy", 
            "colour" : "Blue", 
            "animal" : "Triceratops", 
            "_id" : ObjectId("550234d3d06039d507d238dd") 
        }, 
        { 
            "name" : "Zach", 
            "colour" : "Black", 
            "animal" : "Mastadon", 
            "_id" : ObjectId("550234d3d06039d507d238dc") 

        },
        {
            "name" : "Tommy",
            "colour" : "Green",
            "animal" : "Dragon"
            "_id" : ObjectId("550234d3d06039d507d238d9") 
        }   
    ]
},{ 
    "name" : "Bot Table", 
    "_id" : ObjectId("5502d205184cd74033f64e6b"),
    "body" : [ 
        { 
            "name" : "Optimus", 
            "team" : "Autobots", 
            "class" : "Leader", 
            "_id" : ObjectId("550234d3d06039d507d238d9") 
        }, 
        { 
            "name" : "Bumblebee", 
            "team" : "Autobots", 
            "class" : "Scout", 
            "_id" : ObjectId("550234d3d06039d507d238da") 
        }, 
        { 
            "name" : "Astrotrain", 
            "team" : "Decepticons", 
            "class" : "Transport", 
            "_id" : ObjectId("550234d3d06039d507d238db") 

        }
    ]
}]

The Code 编码

var BodySchema = new Schema({random: String},{strict:false});

var FeedSchema = new Schema({
  name: String,
  body:[BodySchema]
});

var feed = mongoose.model('Feed', FeedSchema);

feed.find({_id:'550234d3d06039d507d238d8'})
    .populate({
        "path":"body",
        "options":{
            limit:2, //This works fine
            skip:2  //This doesn't work
        }
    })
    .exec(function(err, result){

        if(err){return(res.send(500, err))}

        res.send(result);
    });

The Result The above code DOES limit the number of "body" sub-documents to 2, but doesn't skip any. 结果上面的代码确实将“ body”子文档的数量限制为2,但是不跳过任何子文档。

The code above returns this: 上面的代码返回以下内容:

{ 
    "name" : "Ranger Table", 
    "_id" : ObjectId("550234d3d06039d507d238d8"),
    "body" : [ 
        { 
            "name" : "Jason", 
            "colour" : "Red", 
            "animal" : "T-rex", 
            "_id" : ObjectId("550234d3d06039d507d238de") 
        }, 
        { 
            "name" : "Billy", 
            "colour" : "Blue", 
            "animal" : "Triceratops", 
            "_id" : ObjectId("550234d3d06039d507d238dd") 
        }
    ]
} 

But it should return this: 但是它应该返回以下内容:

{ 
    "name" : "Ranger Table", 
    "_id" : ObjectId("550234d3d06039d507d238d8"),
    "body" : [ 
        { 
            "name" : "Zach", 
            "colour" : "Black", 
            "animal" : "Mastadon", 
            "_id" : ObjectId("550234d3d06039d507d238dc") 

        },
        {
            "name" : "Tommy",
            "colour" : "Green",
            "animal" : "Dragon"
            "_id" : ObjectId("550234d3d06039d507d238d9") 
        }
    ]
} 

The solution that I found was to use aggregate and specify the name of the subdocument with $unwind. 我发现的解决方案是使用聚合并使用$ unwind指定子文档的名称。

http://docs.mongodb.org/manual/reference/operator/aggregation/ http://docs.mongodb.org/manual/reference/operator/aggregation/

feed.aggregate([
    {'$match':{_id:id('550234d3d06039d507d238d8')}},
    {'$unwind':'$body'},
    {'$skip':2},
    {'$limit':2},
], function(err, result){

    if(err){return(res.send(500, err))}

    res.send(result);

});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM