当前位置: 首页 > 知识库问答 >
问题:

Mongodb如何在聚合框架管道中过滤文档为下一阶段不传递带空的字段[重复]

罗诚
2023-03-14
{
 _id:'5e2b8a2065318f95166deedc'
 expenses:[{amount:100},{amount:200}]
},
{
 _id:'5e2b8a2065318f95166deedc'
 expenses:[]
},
{
 _id:'5e2b8a2065318f95166deedc'
 expenses:[{amount:400},{amount:600}]
}

这是我到目前为止所尝试的:

Exps.aggregate([

    {$match: {"id":ObjectId(myId)}},

    {$group:{
        _id:'$_id',
        expenses:{$last:"$expenses"},
    }}
   ])

但这将返回所有三个子文档,包括空的一个子文档。我怎样才能仅仅获得第一个和第三个子文档(根据我的示例),以便我可以将它们传递到管道上的下一步?

共有1个答案

祁奇略
2023-03-14

如果expends有一个或多个条目,则expends.1将存在。因此,以下方法将起作用。

db.collection.aggregate([
  {
    $match: {
      "expenses.1": {
        $exists: true
      }
    }
  }
])

https://mongoplayground.net/p/hkti0fj8u3i

或将sizenot一起使用

db.collection.aggregate([
  {
    $match: {
      "expenses": {
        $not: {
          $size: 0
        }
      }
    }
  }
])
 类似资料:
  • 如果文档集合包含: 我想构建一个聚合,通过我的myDocRefId字段只返回没有被任何其他文档引用的文档。对于这个集合,我想返回: 文档1在聚合中被删除,因为文档3具有对它的引用。 如何在聚合管道中实现这一点?

  • 我这里有两个集合: } 和 “设备”集合中的访客日志是指第二个集合,即访客日志。 我需要找到每个目的访问次数最多的单位。 我在mongo shell中尝试过: 我得到以下结果: 这意味着,例如,编号为05in12in2的单位的访问量最大,其目的是“业务” 我现在想获得05in12in2的“商务”访问次数。我认为它在第一个小组阶段的“计数”变量中。 我如何访问它?我在倒数第二个阶段尝试了,即在限制阶

  • 我遇到了一个很烦人的问题,我似乎找不到任何解决我具体情况的办法。在mongo agggregation管道中,我希望添加一个字段,并根据另一个字段子字段的存在情况,为该另一个字段的子字段赋值,如果该另一个字段的子字段不存在,则为1赋值。 以下是我所尝试的: 但是,它只适用于字段存在的情况。在另一种情况下,该新字段根本不添加到管道中。你知道我做错了什么吗?

  • 我在尝试使用MongooseJs在Mongodb中按嵌套数组排序时遇到了一个小问题。 a)一个产品包含任务,每个任务都有子任务。 b)任务有顺序 这是一个示例产品文档: 结果: } 我正在使用MongoDB聚合管道来订购任务 结果: } 预期结果: 我真的很接近了,所有的排序似乎都在工作。我只需要一些帮助来将子任务放回父母体内。非常感谢任何帮助。 谢谢

  • 我试图使用MongoDb列出展开嵌套数组。 一个产品包含任务,每个任务可以有零个、一个或多个子任务。 以下是产品文档示例: 结果: 聚合管道在对任务进行排序方面起到了很大的作用 有时任务没有子任务,例如: 当他们没有孩子的时候,还有什么可以帮助他们完成任务吗? 当前聚合: 期望的结果:

  • 给定具有以下文档结构的MongoDB集合: 其中每个文档包含一个子文档数组,我希望将集合转换为以下结构的文档: 其中每个子文档现在是主文档中以子文档中的一个值命名的新字段的值(在该示例中,< code>animal字段的值用于创建新字段的名称,即< code>cat和< code>dog)。 我知道如何使用爪哇脚本片段进行。它很慢。我的问题是:如何使用聚合管道完成此操作?