【问题标题】:Mongoose aggregation query return more than one record when it should return only oneMongoose 聚合查询在应该只返回一条记录时返回多条记录
【发布时间】:2019-10-08 20:37:31
【问题描述】:

我有以下查询,它应该提取从所有用户发送给单个用户的最新消息:

    await Conversation.aggregate(
      [
        // Matching pipeline, similar to find
        {
          $match: {
            recipient: mongoose.Types.ObjectId(id)
          }
        },
        // Sorting pipeline
        {
          $sort: {
            date: -1
          }
        },
        // Grouping pipeline
        {
          $group: {
            _id: "$_id",
            sender: {
              $first: "$sender"
            },
            text: {
              $first: "$text"
            },
            date: {
              $first: "$date"
            },
            unread: {
              $first: "$unread"
            }
          }
        },
        {
          $lookup: {
            from: "users",
            localField: "sender",
            foreignField: "_id",
            as: "sender"
          }
        },
        { $unwind: { path: "$sender" } },
        // Project pipeline, similar to select
        {
          $project: {
            sender: 1,
            _id: 1,
            text: 1,
            date: 1,
            unread: 1
          }
        }
      ],
      function(err, messages) {
        if (err) {
          console.log("err with agg query", err);
        } else {
          console.log("latestMessages", messages);
        }
      }
    );

问题在于它返回的记录不止一条。它返回:

[
  {
    _id: 5d9b51eed6606f12f5434d46,
    sender: {
      _id: 5d9b5142d6606f12f5434d41,
      email: null,
      numberOfPosts: 0,
      date: 2019-10-07T14:52:50.467Z,
      __v: 0
    },
    text: 'Ayyy',
    date: 2019-10-07T14:55:42.141Z,
    unread: false
  },
  {
    _id: 5d9b5178d6606f12f5434d43,
    sender: {
      _id: 5d9b5142d6606f12f5434d41,
      email: null,
      numberOfPosts: 0,
      date: 2019-10-07T14:52:50.467Z,
      __v: 0
    },
    text: 'hey!',
    date: 2019-10-07T14:53:44.073Z,
    unread: false
  }
]

当它应该只返回发送者为5d9b5142d6606f12f5434d41 的第一个元素时,即第一个最新的对象。

我在这里做错了什么?

【问题讨论】:

  • 您在 $_id 上进行分组,作为响应,您看起来有单独的唯一 _id,这就是为什么它们没有分组在一起,因为 $group 将根据 _id 中给出的字段进行分组。跨度>

标签: mongodb mongoose


【解决方案1】:

像改变 qroup 管道一样

您需要根据发件人而不是唯一 _id 进行分组

{
          $group: {
            _id: "$sender",
            sender: {
              $first: "$sender"
            },
            messageId: {
              $first: "$_id"
            },
            text: {
              $first: "$text"
            },
            date: {
              $first: "$date"
            },
            unread: {
              $first: "$unread"
            }
          }
        }

$project 的变化

$project: {
            sender: 1,
            _id: "$messageId",
            text: 1,
            date: 1,
            unread: 1
          }

【讨论】:

  • 但这不会为我返回 MessageID
  • MongoError: Unrecognized expression '$first'
  • Ohh _id 冲突,因此您需要在查询中进行一些更改
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多