MongoDB 聚合过滤器 returns 空

MongoDB aggregate filter returns null

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

我有兴趣通过 id 查询父文档,并说过滤 contactedNumberMessages 以仅包含传入消息(方向为“in”的消息)所以我用 Mongoose 编写了以下代码,但是 contactedNumberMessages 在返回的数据中是 null,关于我为什么得到 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"
            }
          ]
        }
      ]
    }
  ]
}

请参考这里的例子: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"]
          }
        }
      }
    }
  }
}}]

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

的正常数组

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