【问题标题】:How to automatically add all fields except one when doing aggregation?聚合时如何自动添加除一个以外的所有字段?
【发布时间】:2019-10-20 01:59:14
【问题描述】:

我有一个 mongodb 集合,其中包含具有多个属性(可能很多)的对象。其中一个是另一个对象类型的数组,并且该类型有一个布尔属性StateChanged

我想查询返回此集合中的所有记录,并过滤数组以仅获取带有StateChanged = true 的文档。

这是我已经做过的:

db.getCollection('Cycles').aggregate([
    {
        $project: {
            _id: 0,
            // Here I could add Field1: 1, Field2: 1,...
            'Subcycles' : {
                $filter : {
                    input: '$Subcycles',
                    as : 'sub',
                    cond: { $eq: ['$$sub.StateChanged',true]}
                }
            }
        }
    }
])

但是,这只会给我带来“子循环”系列。 我想要的是在根文档中包含其他字段。

我可以在投影中手动指定它们(如 Field1:1,Field2:1,...),但由于可能有很多字段,我想知道是否有一种方法可以自动将它们全部显示出来。

提前致谢!

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework projection


    【解决方案1】:

    您可以使用$addFields 代替$project。它会自动将新字段替换为现有字段。

    db.getCollection("Cycles").aggregate([
      { "$addFields": {
        "Subcycles": {
          "$filter": {
            "input": "$Subcycles",
            "as": "sub",
            "cond": { "$eq": ["$$sub.StateChanged", true] }
          }
        }
      }},
      { "$project" : { "_id": 0 }}
    ])
    

    【讨论】:

      【解决方案2】:

      您可以使用$addFields,然后使用$project 排除_id 字段:

      db.getCollection('Cycles').aggregate([
          {
              $addFields: {
                  'Subcycles' : {
                      $filter : {
                          input: '$Subcycles',
                          as : 'sub',
                          cond: { $eq: ['$$sub.StateChanged',true]}
                      }
                  }
              }
          },
          {
             $project: {
                _id: 0
             }
          }
      ])
      

      【讨论】:

      • 感谢 mickl,但 @Franpark 更快 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多