【问题标题】:Filtering aggregation with mongodb使用 mongodb 过滤聚合
【发布时间】:2020-03-29 16:17:01
【问题描述】:

我需要过滤此查询,以便不显示值为 Undefined 的文档。目前,我的代码显示了这个结果:

db.getCollection("actors").find({})

db.actors.aggregate([
    {
        $group: { _id: "$cast", Peliculas: { $sum: 1 } },
    },
    { $sort: { Peliculas: -1 } },
    { $limit: 2 }
])

我需要一些过滤器使Undefined 消失,以便将我显示为第一个值:Harold Lloyd

我之前做过如下操作:

//unwind
    db.getCollection("Tarea").find({})
    fase1 = { $unwind: "$cast"}
    etapas = [fase1]
    db.Tarea.aggregate( etapas )

    //out
    fase1 = { $unwind: "$cast" }
    query2 = { "_id": 0 }
    fase2 = { $project: query2 }
    fase3 = { $out: "actors" }
    etapas = [ fase1, fase2, fase3 ]
    db.Tarea.aggregate( etapas )

现在我有了一个名为“演员”的新系列。

【问题讨论】:

标签: mongodb


【解决方案1】:

如果您想消除cast array is empty 的所有记录,@hbamithkumara 答案将完美运行。但是,如果您还想使用No Cast 等默认文本显示所有empty cast array 的计数Peliculas,您可以试试这个

你可以测试一下here

  db.collection.aggregate([
  {
    $project: {
      cast: {
        $cond: {
          if: {
            $eq: [
              "$cast",
              []
            ]
          },
          then: [
            "No Cast"
          ],
          else: "$cast"
        }
      }
    }
  },
  {
    $group: {
      _id: "$cast",
      Peliculas: {
        $sum: 1
      }
    }
  }
])

结果会是这样的

   [
  {
    "Peliculas": 1,
    "_id": [
      "Paul Boyton"
    ]
  },
  {
    "Peliculas": 1,
    "_id": [
      "Ching Ling Foo"
    ]
  },
  {
    "Peliculas": 21,
    "_id": [
      "No Cast"
    ]
  }
]

【讨论】:

  • 我认为没有必要,因为在问题中提到了我需要一些使未定义消失的过滤器
  • 您的答案是正确的并且有效,但它只是另一个可用的选项,在其他一些用例中可能会派上用场。
【解决方案2】:

试试这个..

Sample live demo

db.collection.aggregate([
  {
    $match: {
      cast: {
        $exists: true,
        $not: {
          $size: 0
        }
      }
    }
  },
  {
    $group: {
      _id: "$cast",
      Peliculas: {
        $sum: 1
      }
    }
  },
  {
    $sort: {
      Peliculas: -1
    }
  },
  {
    $limit: 2
  }
])

参考

Mongodb - $match

Mongodb - $size

Mongodb - $exists

【讨论】:

  • 谢谢大家。也许我没有很好地表达自己。我真正需要的是:在演员上,获取参加过更多电影的演员的顶级列表((可以将其限制为只有一个,因为可以修改该参数),而不删除未定义的记录,但过滤以便他们根本不会出现在查询中。我希望他们继续以未定义的身份出现,但不要以参与电影的顶级演员的身份出现。谢谢!
【解决方案3】:

我终于解决了,将这一行添加到代码中:

{$match: {cast:{$ne:"Undefined"}}}

所以现在完整的代码如下所示:

db.actors.aggregate([
{$match: {cast:{$ne:"Undefined"}}},
{$group : {_id: "$cast", total : {$sum: 1 }}},
{$sort:{total:-1}},
{$limit:5}])

我可以看到没有未定义的前 5 个演员列表:

enter image description here

谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2021-07-26
    • 2021-11-18
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多