MongoDB:如何按x.foo或y.foo其中一个嵌套字段排序?
解决方案
为什么无法用find().sort()直接实现
MongoDB的find().sort()仅支持基于固定字段路径排序,没法动态判断并选取x.foo或y.foo作为排序依据,因此必须用聚合管道实现需求。
聚合管道实现方案
通过聚合管道先提取统一的foo值,再基于该值排序,可选恢复原文档结构:
代码示例
db.collection.aggregate([ // 提取统一的foo字段:x.foo存在则取它,否则取y.foo { $addFields: { tempFoo: { $ifNull: ["$x.foo", "$y.foo"] } } }, // 按tempFoo升序排序 { $sort: { tempFoo: 1 } }, // 可选:移除临时字段,保持原文档结构 { $project: { tempFoo: 0 } } ])
逻辑说明
$addFields阶段:利用$ifNull运算符,结合你提到的"foo仅存在于x或y中一个"的前提,生成统一的临时排序字段tempFoo。$sort阶段:基于tempFoo升序排序,得到目标结果。$project阶段:可选步骤,移除临时字段,让返回文档和原结构一致。
执行结果
运行上述命令后,将返回你需要的排序后文档:
{ "_id": ObjectId("5a6eb97b2937803b14255181"), "x": { }, "y": { "foo": 24 } }, { "_id": ObjectId("5a6eb97b2937803b14255180"), "x": { "foo": 42 }, "y": { } }
内容的提问来源于stack exchange,提问作者yolo expectz
相关产品推荐
相关产品推荐

