【问题标题】:MongoDB aggregate filter returns nullMongoDB 聚合过滤器返回 null
【发布时间】:2021-11-18 03:54:24
【问题描述】:

在 MongoDB 中,我有一个消息集合(在下面找到):

我有兴趣通过 id 查询父文档,并说过滤 contactedNumberMessages 以仅包含传入消息(方向为“in”的消息)所以我用 Mongoose 编写了以下代码,但是 contactedNumberMessages 是 @987654323 @ 在返回的数据中,关于我为什么得到 null 的任何线索?谢谢

Messages.aggregate([
    {
      $match: {
        _id: id
      }
    },
    {
      $project: {
        messaging: {
          ourNumber: 1,
          messages: {
            contact: 1,
            contactedNumberMessages: {
              $filter: {
                input: "$contactedNumberMessages",
                as: "message",
                cond: {
                  $eq: ["$$message.direction", "out"]
                }
              }
            }
          }
        }
      }
    }
  ]);
{
  "_id": {
    "$oid": "612f4e32aa56064f1608c2eb"
  },
  "messaging": [
    {
      "ourNumber": "+15123568549",
      "messages": [
        {
          "contact": "+21629000111",
          "contactedNumberMessages": [
            {
              "direction": "out",
              "content": "Hello!",
              "when": {
                "$date": "2021-09-23T23:00:00.000Z"
              },
              "nature": "SMS"
            },
            {
              "direction": "in",
              "content": "Hi!",
              "when": {
                "$date": "2021-09-23T23:00:00.000Z"
              },
              "nature": "SMS"
            }
          ]
        }
      ]
    }
  ]
}

【问题讨论】:

    标签: mongodb filter projection


    【解决方案1】:

    请参考此处的示例:https://mongoplayground.net/p/9toRoa_5IE9

    你应该在聚合中使用类似下面的东西:

    [{$match: {
      _id: ObjectId('612f4e32aa56064f1608c2eb')
    }}, {$unwind: {
      path: '$messaging',
    }}, {$unwind: {
      path: '$messaging.messages',
    }}, {$project: {
            messaging: {
        ourNumber: 1,
        messages: {
          contact: 1,
          contactedNumberMessages: {
            $filter: {
              input: "$messaging.messages.contactedNumberMessages",
              as: "message",
              cond: {
                $eq: ["$$message.direction", "out"]
              }
            }
          }
        }
      }
    }}]
    

    由于您在数组和子数组中嵌套了数组,过滤阶段没有得到正确的输出,我添加了展开以获得字段的正常数组:messaging.messages.contactedNumberMessages

    如果需要,您可以再次执行 groupby 以确保您获得预期格式的文档,因为在展开后,它将为数组中展开的每个文档创建多个聚合文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2019-03-13
      • 2020-09-05
      • 2015-07-23
      • 2020-04-14
      相关资源
      最近更新 更多