如何在Mongoose中按ID查询文档并对addressBook.default降序排序
在Mongoose中按ID查询并对文档内数组元素排序的正确姿势
你遇到的问题很典型——sort()方法其实是用来对整个集合里的文档进行排序的,不是针对单个文档内部的数组元素排序,所以直接用findById().sort('-addressBook.default')肯定达不到你想要的效果。下面给你两种可行的解决方案,你可以根据自己的场景选择:
方案一:用聚合框架在数据库端排序(推荐大数据量场景)
MongoDB的聚合管道可以帮你在数据库层面完成数组的排序操作,效率更高,适合数据量较大的情况。具体步骤是先匹配目标文档,展开数组,排序后再重新组合:
const mongoose = require('mongoose'); WebsiteUser.aggregate([ // 匹配指定ID的用户文档 { $match: { _id: mongoose.Types.ObjectId(req.user.id) } }, // 展开addressBook数组,让每个数组元素成为独立的文档片段 { $unwind: "$addressBook" }, // 按addressBook.default字段降序排序(-1代表降序) { $sort: { "addressBook.default": -1 } }, // 重新组合文档,把排序后的数组元素聚合回去 { $group: { _id: "$_id", email: { $first: "$email" }, fullName: { $first: "$fullName" }, addressBook: { $push: "$addressBook" } } } ]).exec((err, results) => { if (err) { console.error('查询出错:', err); return; } // 聚合返回的是数组,取第一个元素就是我们要的排序后的文档 const sortedUser = results[0]; console.log(sortedUser); });
方案二:查询后在内存中排序(适合小数据量场景)
如果你的用户文档数据量不大,直接在Node.js内存中对数组排序会更简单直观,代码也更简洁:
WebsiteUser.findById(req.user.id).exec((err, user) => { if (err) { console.error('查询出错:', err); return; } // 对addressBook数组按default字段降序排序 user.addressBook.sort((addrA, addrB) => addrB.default - addrA.default); // 此时user的addressBook已经是排序后的结果 console.log(user); });
小提醒
注意看你提供的文档里,default字段后面带了个空格("default ": 1),如果这不是笔误,那上面代码里的字段名也要对应加上空格,比如"addressBook.default "。不过更建议你修正字段名,去掉多余的空格,避免后续出现不必要的字段匹配问题。
内容的提问来源于stack exchange,提问作者William Cheang Chin Heng
相关产品推荐
相关产品推荐

