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 が null でないすべてのユーザーを見つけて、作成日で並べ替えることでした:

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

各結果は写真である必要があり、結果を特定の量に制限し、ページ表示のために結果をスキップできる必要があります。

さらに情報が必要な場合はお知らせください。ご回答いただきありがとうございます。

4

2 に答える 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
}
于 2013-02-22T07:13:40.693 に答える
1

私はあなたがこのようなものが欲しいと思います:

db.Users.aggregate( [
{$unwind:"$Photos"},
{$sort: {"Photos.created":-1},
{$limit: 10}
] );
于 2013-02-22T06:55:54.280 に答える