You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:01:30