猫鼬聚合查询仅应返回一条记录时返回多条记录

时间:2019-10-08 08:26:30

标签: mongodb mongoose

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

    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
  }
]

当应该仅返回sender为5d9b5142d6606f12f5434d41的第一个元素时,即第一个最新对象。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:1)

更改qroup管道就像

您需要按发件人分组,而不要使用唯一的_id

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

然后更改$ project

{{1}}