配列内の複数のフィールドを照会する方法 (例: $elemMatch ) を教えてください。また、並べ替えを適用する方法があります。l 内の複数のフィールドを照会すると無視されます。
ドキュメントは ts: -1 ソート順で返されません - 1 つの配列フィールドをクエリすると正常に動作します。スキップと制限は、期待どおりに並べ替えに影響しません。
サンプルクエリ
db.transactions.find({ 'l.id': '5612087d70634d009dd919e5bb07fdad', 'l.t': 'organization' } ).sort({ ts: -1 }.skip(0).limit(10).toArray()
db.transactions.find({ l: { $elemMatch: { id: '5612087d70634d009dd919e5bb07fdad', t: 'organization' } } } ).sort({ ts: -1 }.skip(0).limit(10).toArray()
この集計は機能しますが、l の残りの内容は失われます
db.transactions.aggregate({$unwind:"$l"},{$match:{"l.t":"organization", "l.id":"5612087d70634d009dd919e5bb07fdad"}}, {$sort:{"ts":-1}})
サンプルデータ - この質問の要因ではなく、重複した ID を無視してください。
[
{
"t" : "organization.save",
"d" : {
"new" : false,
"id" : "5612087d70634d009dd919e5bb07fdad"
},
"ts" : ISODate("2013-08-20T02:21:39.955Z"),
"l" : [
{
"t" : "organization",
"id" : "5612087d70634d009dd919e5bb07fdad"
},
{
"t" : "account",
"id" : "5612087d70634d009dd919e5bb07fdad"
}
],
"_id" : "95c6cd5310aa485582312319f74775a4",
"__v" : 0
},
{
"t" : "organization.save",
"d" : {
"new" : false,
"id" : "5612087d70634d009dd919e5bb07fdad"
},
"ts" : ISODate("2013-08-20T02:21:43.121Z"),
"l" : [
{
"t" : "organization",
"id" : "5612087d70634d009dd919e5bb07fdad"
},
{
"t" : "account",
"id" : "5612087d70634d009dd919e5bb07fdad"
}
],
"_id" : "d6434c3e9a1743afaa6c0961b5a69f70",
"__v" : 0
}
]
編集:起動して実行するために、t + ':' + id の複合フィールドを作成しました。これで今のところソートの問題は解決しましたが、データが二重になるため理想的ではありません。