2013-02-22 55 views
4

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

用户

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

我在解决这第一次尝试是找到所有用户,其中的照片是不为空,并通过创建日期进行排序是:

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

不幸的是,这并未没有工作,因为我需要它。它按最近的图像对用户进行排序,但仍返回所有图像,并且无法限制该功能返回的图像数量。

我开始关注聚合,看起来它可能是我正在寻找的解决方案,但我无法找到如何使其工作。

理想情况下,我想回来会是这样的结果的类型:

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

每个结果应该是一个照片,我应该能够将结果限制为特定的金额,并跳过结果用于分页浏览。

如果您需要更多信息,请让我知道,并感谢您的回复。

回答

6

您需要聚合框架:

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://www.example.com/photo3.jpg", 
       "created" : "2013-02-03" 
      } 
     }, 
     { 
      "name" : "Bob", 
      "Photos" : { 
       "_id" : 3, 
       "url" : "http://www.example.com/photo2.jpg", 
       "created" : "2013-02-02" 
      } 
     } 
    ], 
    "ok" : 1 
} 
+0

谢谢你,这工作。 我自己就这么接近这个解决方案,但是我做错了的是我把所有的管道放在一个对象中。 – 2013-02-22 07:38:34

+0

欢迎您!下一次只需转到mongodb文档以避免此类错误;) - > http://docs.mongodb.org/manual/applications/aggregation/ – 2013-02-22 07:49:34

1

我想你想是这样的:

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