MongoDB:尝试使用聚合$unwind获取嵌套文档

5

我有一个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")
            }
        ]
    }
]

我尝试的第一步是找到所有Photos不为空的用户,并按创建日期排序:

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")
    }
]

每个结果应该是一张照片,我应该能够限制结果的数量,并跳过结果以进行分页查看。
如果您需要更多信息,请告诉我,谢谢您的回复。
2个回答

7
您需要使用聚合框架:
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
}

谢谢,那个起作用了。我离自己找到这个解决方案很近了,但我做错的是把所有的管道都放在一个对象中。 - Matthew Lucas
不客气!下次只需查阅MongoDB文档,就能避免这样的错误 ;) -> http://docs.mongodb.org/manual/applications/aggregation/ - Andrew Orsich

1
我认为你想要这样的内容:

我认为你想要这样的内容:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接