如何用MongoDB聚合实现优先取likes、无则取dislikes并过滤无值文档?
解决方案
你可以通过MongoDB聚合的$match阶段实现需求,核心逻辑是过滤掉同时不存在likes和dislikes字段的文档,保留至少存在其中一个字段的文档:
db.collection.aggregate([ { $match: { $or: [ { likes: { $exists: true } }, { dislikes: { $exists: true } } ] } } ])
逻辑说明
$match阶段用于筛选符合条件的文档:$or表达式指定两个可选条件,满足任意一个即可保留文档:{ likes: { $exists: true } }:匹配存在likes字段的文档(无论是否包含dislikes){ dislikes: { $exists: true } }:匹配仅存在dislikes字段的文档
该逻辑会自动过滤掉既无likes也无dislikes的文档,最终结果与你给出的期望输出完全一致。
验证示例
输入数据
const data = [ { _id: 0, name: "jane", joined: ISODate("2011-03-02"), dislikes: 9 }, { _id: 1, name: "joe", joined: ISODate("2012-07-02") }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02"), likes: 60, dislikes: 2 }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02"), dislikes: 12 }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02"), dislikes: 12 }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02") } ]
输出结果
[ { _id: 0, name: "jane", joined: ISODate("2011-03-02"), dislikes: 9 }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02"), likes: 60, dislikes: 2 }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02"), dislikes: 12 }, { _id: 2, name: "Ant", joined: ISODate("2012-07-02"), dislikes: 12 } ]
内容的提问来源于stack exchange,提问作者Zillur Rahman
相关产品推荐
相关产品推荐

