【问题标题】:Remove specific object from array during aggregation在聚合期间从数组中删除特定对象
【发布时间】:2020-10-24 15:05:48
【问题描述】:

我有以下结构的文档:

{field: ["id1", "id3"]},
{field: ["id2", "id1"]}

查询我使用的文档

aggregate({$match: {'field' : { $in: ['id1'] }}})

我得到了这个查询的文档,但我只想要

{field: ["id2"]},
{field: ["id3"]}

即,我只想在聚合步骤中从数组中删除"id1",而不是从实际文档中删除(通过$pull 或类似的更新)。

【问题讨论】:

    标签: arrays mongodb mongoose mongodb-query


    【解决方案1】:

    假设我们在名为collection 的集合中有以下文档:

    db.collection.insert({field: ["id1", "id3"]})
    db.collection.insert({field: ["id2", "id1"]})
    

    那么下面的聚合管道就可以解决问题了:

    db.collection.aggregate([
      {
        $match: {field: "id1"}
      },
      {
        $project: {
          field: {
            $filter: {
              input: "$field",
              as: "item",
              cond: {
                $ne: ["$$item", "id1"]
              }
            }
          }
        }
      }
    ])
    

    mongo shell 的输出是:

    { "field" : [ "id3" ] }
    { "field" : [ "id2" ] }
    

    另一种方法是 $unwind field 然后 $group 回复:

    db.collection.aggregate([
      {
        $match: {field: "id1"}
      },
      {
        $unwind: "$field"
      },
      {
        $group: {
          _id: "$_id",
          field: {
            $push: {
              $cond: {
                if: { $eq: [ "$field", "id1" ] },
                then: "$$REMOVE",
                else: "$field"
              }
            }
          }
        }
      },
      {
        $project: {
          _id: 0
        }
      }
    ])
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 2019-11-02
      • 2019-12-03
      • 2013-12-13
      • 1970-01-01
      • 2011-11-09
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多