mongodb に埋め込まれた配列の結果を並べ替えたり制限したりするのに最も苦労しています。シナリオは次のとおりです。
投稿にコメントの配列が含まれる投稿コメント構造があります。コメントのリストを作成し、createdAt で並べ替えて、制限/オフセットを実行したいと思います。=]
...構造のサンプルを次に示します。
{ "_id" : ObjectId("52707a234f2044b7f2d22083"),
"comments" : [{
"_id" : ObjectId("5270986b4f204f5dd51ada8a"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:03.858Z")},
{
"_id" : ObjectId("527098714f204f5dd51ada8b"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:09.425Z")
}
],
"createdAt" : ISODate("2013-10-30T03:16:51.745Z"),
"likes" : [ ],
"status" : "simbora!!",
"userid" : NumberLong(1)
}
だから...私はこのクエリを試すことができます:
db.post.aggregate([
{$match: {_id: new ObjectId("52707a234f2044b7f2d22083")}},
{$unwind: "$comments"},
{$sort: {"comments.createdAt": -1}},
{$limit: 2}
]);
そしてそれは私にこれを与えました:
"result" : [
{
"_class" : "models.documents.Post",
"_id" : ObjectId("52707a234f2044b7f2d22083"),
"comments" : {
"_id" : ObjectId("527098714f204f5dd51ada8b"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:09.425Z")
},
"createdAt" : ISODate("2013-10-30T03:16:51.745Z"),
"likes" : [ ],
"status" : "simbora!!",
"userid" : NumberLong(1)
},
{
"_class" : "models.documents.Post",
"_id" : ObjectId("52707a234f2044b7f2d22083"),
"comments" : {
"_id" : ObjectId("5270986b4f204f5dd51ada8a"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:03.858Z")
},
"createdAt" : ISODate("2013-10-30T03:16:51.745Z"),
"likes" : [ ],
"status" : "simbora!!",
"userid" : NumberLong(1)
}
],
"ok" : 1
コメントはもはや配列ではなくオブジェクトであることに注意してください...そして、順序付けられた限定されたセットを提供しますが、すべてのコメントの親オブジェクトも提供します...それはあまり良くありません。だから私はこれを試しました:
db.post.aggregate([
{$match: {_id: new ObjectId("52707a234f2044b7f2d22083")}},
{$unwind: "$comments"},
{$sort: {"comments.createdAt": -1}},
{"$project": {"_id": 0, "comments": "$comments"}},
{"$group": {"_id": "$_id", "comments": {"$push": "$comments"}}},
]);
そしてそれは私にこれを与えました:
{
"result" : [
{
"_id" : null,
"comments" : [
{
"_id" : ObjectId("527098714f204f5dd51ada8b"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:09.425Z")
},
{
"_id" : ObjectId("5270986b4f204f5dd51ada8a"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:03.858Z")
},
{
"_id" : ObjectId("527098694f204f5dd51ada89"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:26:01.174Z")
},
{
"_id" : ObjectId("527098674f204f5dd51ada88"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:25:59.795Z")
},
{
"_id" : ObjectId("527098644f204f5dd51ada87"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:25:56.936Z")
},
{
"_id" : ObjectId("527098604f204f5dd51ada86"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:25:52.379Z")
},
{
"_id" : ObjectId("52707a234f2044b7f2d22083"),
"comment" : "asdfasdf asdfasdfa ",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:24:36.539Z")
},
{
"_id" : null,
"comment" : "bla bla",
"userid" : NumberLong(1),
"likes" : [ ],
"createdAt" : ISODate("2013-10-30T05:23:24.037Z")
}
]
}
],
"ok" : 1
}
制限を適用してオペレーターをスキップすると、コメントではなく投稿で制限されるため、これもあまり良くありません...
誰でも私を助けることができますか??