MongoDB Shell中排序数组是否必须使用$push操作符?
MongoDB数组排序的替代方法(无需强制使用$push)
你完全不需要依赖$push来排序数组,以下是几种更合适的方案:
1. 聚合管道更新(推荐,MongoDB 4.2+)
MongoDB 4.2及以上版本支持用聚合管道执行更新操作,其中$sortArray操作符可以直接对数组字段排序,语法更直观,完全不需要额外的推送操作:
db.products.updateOne( {"name": "ben"}, [ {$set: { hobbies: {$sortArray: {input: "$hobbies", sortBy: -1}} }} ] )
这里sortBy: -1是降序排序,改成1就是升序。如果是对象数组,还可以指定字段排序,比如sortBy: {age: 1}。
2. 保留$push但用空$each(你当前的写法)
虽然你没实际推送元素,但这种写法确实能生效——MongoDB会识别$push里的$sort选项,即使$each是空数组,也会对目标数组执行排序。这种方法兼容更早的MongoDB版本,但语义上有点别扭:
db.products.updateOne( {"name": "ben"}, {$push: {"hobbies": {$each: [], $sort: -1}}} )
3. 客户端侧排序后更新
如果数据量不大,也可以先把文档查出来,在客户端对数组排序,再写回数据库:
// 查询文档 const doc = db.products.findOne({"name": "ben"}); // 对hobbies数组排序(字符串降序,数字的话用b - a) doc.hobbies.sort((a, b) => b.localeCompare(a)); // 更新回数据库 db.products.updateOne({"_id": doc._id}, {$set: {hobbies: doc.hobbies}});
这种方法适合小数据集,避免在数据库端执行复杂操作,但要注意并发问题(如果有其他操作同时修改数组,可能会覆盖变更)。
内容的提问来源于stack exchange,提问作者Ifeanyi Chima
相关产品推荐
相关产品推荐

