我有一个MongoDB集合[Users],每个集合都有一个嵌入文档数组[照片]。 我希望能够有个页面列出最近的照片,例如 - 任何用户上传的最近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")
}
]
每个结果应该是一张照片,我应该可以将结果限制为特定的数量,并跳过分页查看的结果。
如果您需要更多信息,请与我们联系,并感谢您的回复。
答案 0 :(得分: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
}
答案 1 :(得分:1)
我想你想要这样的东西:
db.Users.aggregate( [
{$unwind:"$Photos"},
{$sort: {"Photos.created":-1},
{$limit: 10}
] );