【问题标题】:MongoDB query traverse through array of object and choose specific objectMongoDB查询遍历对象数组并选择特定对象
【发布时间】:2021-09-10 14:26:19
【问题描述】:

MongoDB 查询从数组中获取最后/所有对象

{
    WholeData:[
        {
            EnteredAmount:100,
            OverPayment:0,
            Type:"payment",
        },
        {
            EnteredAmount:200,
            OverPayment:0,
            Type:"payment",
        },
    ]
}

{
    WholeData:[
        {
            EnteredAmount:600,
            OverPayment:0,
            Type:"refund",
        },
        {
            EnteredAmount:400,
            OverPayment:0,
            Type:"refund",
        },
    ]
}

这就是示例文档的样子
我想写一个查询结果类似于 如果类型是退款,则推送/保留所有数组对象,否则仅推送/保留最后一个索引对象。 样本输出应该是

{
    WholeData:[

        {
            EnteredAmount:200,
            OverPayment:0,
            Type:"payment",
        },
    ]
}



{
    WholeData:[
        {
            EnteredAmount:600,
            OverPayment:0,
            Type:"refund",
        },
        {
            EnteredAmount:400,
            OverPayment:0,
            Type:"refund",
        },
    ]
}

【问题讨论】:

  • 这是您无法转换为单个查询的内容。
  • 它已经是一个很长的查询了。如果可以在多个管道中完成就可以了

标签: mongodb mongoose mongodb-query


【解决方案1】:

如果Type:"payment",首先我们创建另一个数组来存储 WholeData 的最后一个元素 然后创建项目并检查WholeData是否为空意味着类型为退款 否则付款并创建我们的结果 使用这个聚合

db.collection.aggregate([
[
   {
    '$addFields': {
      'WholeDataP': {
        '$filter': {
          'input': '$WholeData', 
          'as': 'z', 
          'cond': {
            '$and': [
              {
                '$eq': [
                  {
                    '$indexOfArray': [
                      '$WholeData', '$$z'
                    ]
                  }, {
                    '$sum': [
                      {
                        '$size': '$WholeData'
                      }, -1
                    ]
                  }
                ]
              }, {
                '$ne': [
                  '$$z.Type', 'refund'
                ]
              }
            ]
          }
        }
      }
    }
  }, {
    '$project': {
      'WholeData': {
        '$cond': [
          {
            '$eq': [
              {
                '$size': '$WholeDataP'
              }, 0
            ]
          }, '$WholeData', '$WholeDataP'
        ]
      }
    }
  }
]
])

【讨论】:

  • 如果类型是退款,你会理解它有点不同,那么所有数组元素其他明智的最后一个元素和类型可以是付款、发票或其他一些字符串,仅用于退款我需要所有元素,对于所有其他我需要最后一个元素
  • 是的,我也是这么做的。将 $eq 更改为 $ne 并退款,您的更改也相同。如果您可以解释查询的部分和部分,那么整个聚合中到底发生了什么。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多