无法“跳过”猫鼬子文档

Posted

技术标签:

【中文标题】无法“跳过”猫鼬子文档【英文标题】:unable to "skip" mongoose sub-documents 【发布时间】:2015-05-15 23:08:36 【问题描述】:

我正在使用 mongoose 和 node,我正在尝试对子文档中的数据进行分页。我可以限制子文档,但不能跳过它们。

我使用的版本是:

Mongo 3.0.0

节点 0.10.33

猫鼬 3.9.7

数据

[ 
    "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") 

        
    ]
]

守则

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);
    );

结果 上面的代码确实将“body”子文档的数量限制为 2,但不会跳过任何一个。

上面的代码返回这个:

 
    "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" : "Ranger Table", 
    "_id" : ObjectId("550234d3d06039d507d238d8"),
    "body" : [ 
         
            "name" : "Zach", 
            "colour" : "Black", 
            "animal" : "Mastadon", 
            "_id" : ObjectId("550234d3d06039d507d238dc") 

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

【问题讨论】:

这些不是“子文档”而是“参考”文档。 Mongoose .populate() 方法并不是很多人认为的“魔术连接”。实际上,这只不过是由于该函数调用而发生的另一个查询执行,以使外观看起来像“连接”数据。它不支持您尝试执行的“跳过”语义。 相关猫鼬问题populate option skip - not working #2252 Chridam:我看到了,但它描述的问题与我的不同。 Neil Lunn:谢谢伙计。关于我应该如何处理这件事的任何指示? Neil Lunn:文档将我正在做的事情称为子文档。 mongoosejs.com/docs/subdocs.html 【参考方案1】:

我找到的解决方案是使用聚合并使用 $unwind 指定子文档的名称。

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);

);

【讨论】:

以上是关于无法“跳过”猫鼬子文档的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬子文档 field.id 给出未定义

查询父项时如何获取猫鼬子文档数组中的值的聚合总和?

更新猫鼬子架构对象

跳过和限制猫鼬模型子文档/数组

如何使用猫鼬需要验证在猫鼬中插入多个文档?

无法在 MongoDB(猫鼬)文档中追加数组