我不认为你有太多事情要做。
默认情况下,您在_id 上有一个索引,根据mongodoc,您索引的字段可以是整个嵌入文档,其(子)字段 order 很重要。
即{mtid, uid} 是您的嵌入式文档,只要您以相同的(子)字段顺序查询就可以了。
然后您只需按_id 排序。
生成一些数据:
arr = Array(25).fill(0).map((x,i)=>i).sort(x=>Math.random()-0.5).map(x=>[(x-x%5)/5,x%5])
arr.forEach(([mtid, uid],i)=>db.dums.insert({_id:{mtid, uid},n:i}))
就我而言:
{ "_id" : { "mtid" : 2, "uid" : 4 }, "n" : 0 }
{ "_id" : { "mtid" : 2, "uid" : 2 }, "n" : 1 }
{ "_id" : { "mtid" : 0, "uid" : 1 }, "n" : 2 }
{ "_id" : { "mtid" : 0, "uid" : 0 }, "n" : 3 }
{ "_id" : { "mtid" : 0, "uid" : 2 }, "n" : 4 }
{ "_id" : { "mtid" : 2, "uid" : 3 }, "n" : 5 }
{ "_id" : { "mtid" : 3, "uid" : 1 }, "n" : 6 }
...
考虑下面的查询
function query(str){
let [mtid, uid] = str.split('_')
mtid = parseInt(mtid)
uid = parseInt(uid)
const res = db.dums.find({
_id: {
$gt: { mtid, uid }
}
}).limit(2).sort({ _id: 1 }).toArray()
if(!res.length) return {items:[], next:null}
const last = res[res.length-1]._id
const next = last.mtid + '_' + last.uid
print(res.map(x=>x._id.mtid+'_'+x._id.uid).join(';'))
return {
items: res,
next,
goNext(){return query(next)}
}
}
结果:
> var a=query('0_0');
0_1;0_2
> var a=a.goNext();
0_3;0_4
> var a=a.goNext();
1_0;1_1
> var a=a.goNext();
1_2;1_3
> var a=a.goNext();
1_4;2_0
> var a=a.goNext();
2_1;2_2
我们可以观察到项目确实是按mtid、uid排序的