无法“跳过”猫鼬子文档
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);
);
【讨论】:
以上是关于无法“跳过”猫鼬子文档的主要内容,如果未能解决你的问题,请参考以下文章