请告诉我有一种方法可以查询数组中的多个字段(例如 $elemMatch )并应用排序 - 如果我查询 l 中的多个字段,它将被忽略。
ts 中不返回文档:-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 创建了一个复合字段。这已经解决了我现在的排序问题,但由于数据加倍,这并不理想。