如何用MongoDB的find()查询指定docId文档及后续19条文档?
问题
我有一个下拉选择器,需要返回当前选中的、由docId指定的文档,以及另外19个任意顺序的文档。要求仅使用.find()方法,不能使用aggregate()。
示例数据如下:
[ { docId: 'a', data: { name: 'x' }}, { docId: 'b', data: { name: 'y' }}, { docId: 'c', data: { name: 'z' }}, { docId: 'd', data: { name: 't' }}, { docId: 'e', data: { name: 'k' }}, ]
我执行查询语句mongoCollection.find({ $or: [{docId: 'd'}, {}] }).limit(20);,期望先返回docId为'd'的文档,再返回其他文档,但实际得到随机文档,与传入的docId无关。
我还尝试了以下查询语句:
mongoCollection.find({ $or: [{docId: 'd'}, {}] }).limit(20); mongoCollection.find({ $and: [{docId: 'd'}, {}] }).limit(20); mongoCollection.find({ $or: [{}, {docId: 'd'}] }).limit(20);
请问仅使用.find()能否实现该需求?
回答
仅用.find()可以实现这个需求,核心是通过排序规则让指定docId的文档排在最前面,再取前20条。
具体实现:
- 直接用
find({})匹配所有文档(你之前的$or写法等价于匹配全部,但find({})更简洁) - 添加排序条件:用
$expr结合$eq生成优先级,匹配目标docId的文档优先级为1,其他为0,按该优先级降序排列,确保目标文档排在首位 - 最后调用
limit(20)获取结果
对应的查询代码:
const targetDocId = 'd'; mongoCollection.find({}) .sort({ $expr: { $eq: ['$docId', targetDocId] }, $order: -1 }) .limit(20);
你之前的尝试没有设置排序,MongoDB的find()默认按文档存储或索引顺序返回,无法保证目标文档前置,所以必须通过排序强制优先级。
内容的提问来源于stack exchange,提问作者Pian0_M4n
相关产品推荐
相关产品推荐

