首页 > 解决方案 > 如何有条件地删除字段 mongoodb

问题描述

我有一个集合,它的文档看起来像:

{
  _id: ObjectId('111111111122222222223333'),
  my_array: [
    {
      id: ObjectId('777777777788888888889999')
      name: 'foo'
    },
    {
      id: ObjectId('77777777778888888888555')
      name: 'foo2'
    }
    //...
  ]
  //more attributes
}

但是,有些文档有my_array: [{}](其中一个元素是一个空数组)。

如何有条件地添加或删除投影?

我必须在查询结束时将它添加到 mongo 管道中,并且我只想在my_array至少有一个不是空对象的元素时获取它。如果有一个空对象删除它。

我在投影阶段尝试过,$cond$eq不支持。有什么建议可以解决这个问题吗?

标签: mongodbmongodb-queryaggregation-framework

解决方案


您不能在 a 中执行此操作query,但是在聚合中您可以将$filter添加到管道中,如下所示:

db.collection.aggregate([
  {
    $project: {
      my_array: {
        $filter: {
          input: "$my_array",
          as: "elem",
          cond: {
            $ne: [
              {},
              "$$elem"
            ]
          }
        }
      }
    }
  }
])

蒙戈游乐场

但是,除非这是“正确”的行为,否则我建议您清理数据库,维护“正确”结构比在任何地方更新所有查询要简单得多。

您可以使用此更新删除这些对象:

db.collection.update({
  "myarray": {}
},
[
  {
    "$set": {
      "my_array": {
        $filter: {
          input: "$my_array",
          as: "elem",
          cond: {
            $ne: [
              {},
              "$$elem"
            ]
          }
        }
      }
    }
  },
  
],
{
  "multi": false,
  "upsert": false
})

蒙戈游乐场


推荐阅读