Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
550 views
in Technique[技术] by (71.8m points)

社交app上使用mongodb分页查询,实时数据如何去重?

社交app上,使用mongodb进行地理位置检索,用户的经纬度和在线状态是会改变的,分页查询出来的数据在app端显示,后几页可能会有前一页的会员数据,原因是因为会员的经纬度或者在线状态的更改导致原本数据的位置发生改变,导致分页获取到的下一页数据可能在上一页也存在。请问下有什么办法可以解决这个问题。根据一个唯一的字段排序时行不通的,例如创建日期等等,因为根据这个唯一的字段排序时是不符合需求的。我们的需求时必须按照距离升序排序。欢迎业界大佬帮小弟解答一下。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

这个问题我觉得应该主要是因为动态的数据导致分页出来的数据可能重复,关键在于这个动态,所以我能想到的方式大概就是,把动态的看成静态的数据,这样就不会重复

具体操作就是第一次分页查询之后,前端再做后续查询都需要带一个此次分页查数据的最后一个数据的距离字段(因为是升序,那也就是这一页里距离最大的值)作为参数传到后端,那依此参数的分页查询只查询在这个距离之后的数据的第一页即可,这样可以保证就算动态数据也不会影响之后的查询,因为有一个距离参数限制

当然这样的改动就意味着这种分页查询不再是传统的分页查询了,除了第一次是传统的分页查询,后续的分页查询其实只是查了大于距离参数的数据的第一页,永远都是第一页

不知道这样可不可以解决你的问题哈。当然我自己没有遇到过这样的业务问题,也只是纯思考,仅供参考,希望能所有帮助(??????)??


至于评论里提到的这个问题
image.png

既然题主已经接受了这种不一样的分页处理,那这个问题也就很好解决了啊,因为这个不一样的分页是靠

筛选+排序+只取第一页

做到的,那现在你说出现了有些同样距离的取不到的问题,那是因为现在的筛选条件是大于距离参数

改一下筛选即可,改为

距离>=距离参数 and id>id参数 order by 距离,id

也就是说,此时传入后端的不只是有最后一个数据的距离字段,还有最后一个数据的id(当然前提是这个id是自增长,亦或者不是id,是其他任何可以体现数据新旧变化唯一的字段即可)

如果没有这样的id字段,那确实就无解了,也不能说无解,只能说要做到有点麻烦

比如前端拿到那页数据后,再取下一页时,要把当前页数据最大的一个距离的数据取出来,但是这个最大距离的数据也许不止一个,所以要把所有该距离的数据的id筛选出来,作为下一页的查询条件,当然还有之前的距离参数也是查询条件,然后后端去过滤掉

这种方式前后端都要改,而且前端改动比较多,但是若有之前说的根据id>id参数的方式的话,那前端只需要再多加一个参数即可,前端不用再多做一次筛选


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...