GET不返回已发送的消息。仅收件箱项目

问题描述 投票:1回答:1

[当用户发送消息时,它会生成messageTrackingId。现在,它以$ unwinding creatorName作为收件箱中唯一的返回值。我只需要一个用户条目。没有相同用户的重复项。当前,如果其他用户未响应,则他们可以发送多条消息,从而生成新的messageTrackingId。如何使初始发送的消息也显示在收件箱中,以便可以使用该messageTrackingId而不是生成新消息?我已经坚持了一段时间,因此感谢您的帮助。

app.get

app.get("/api/messages", (req, res, next) => {
  query = {};
  inbox = false;
  messageId = false;
  if (req.query.recipientId) {
    query = { recipientId: req.query.recipientId };
    inbox = true;

    Messages.aggregate(
      // Pipeline
      [
        {
          $lookup: {
            from: "users", // other table name
            localField: "creator", // name of users table field
            foreignField: "_id", // name of userinfo table field
            as: "creatorName" // alias for userinfo table
          }
        },
        { $unwind: "$creatorName" },
        {
          $match: {
            recipientId: { $eq: req.query.recipientId }
          }
        },

        // Stage 1
        {
          $group: {
            _id: "$messageTrackingId",
            message: { $addToSet: "$message" },
            recipientId: { $addToSet: "$recipientId" },
            creator: { $addToSet: "$creator" },
            messageTrackingId: { $addToSet: "$messageTrackingId" },
            creatorName: { $addToSet: "$creatorName.instagramName" },
            creationDate: { $addToSet: "$creationDate" }
          }
        },

        // Stage 2
        {
          $project: {
            _id: 1,
            message: { $arrayElemAt: ["$message", 0] },
            recipientId: { $arrayElemAt: ["$recipientId", 0] },
            creator: { $arrayElemAt: ["$creator", 0] },
            messageTrackingId: { $arrayElemAt: ["$messageTrackingId", 0] },
            creatorName: { $arrayElemAt: ["$creatorName", 0] },
            creationDate: { $arrayElemAt: ["$creationDate", 0] }
          }
        }
      ]
    )
      //.populate('creator', 'instagramName')

      .then(documents => {
        if (res.subject === "Test") {
          console.log("Nice");
        }
        if (inbox === false && messageId === false) {
          res.status(200).json({
            message: "User's Sent Messages Retrieved!",
            posts: documents
          });
        }
        if (inbox === true) {
          res.status(200).json({
            message: "User's Inbox Retrieved!",
            posts: documents
          });
        }
        if (messageId === true) {
          res.status(200).json({
            message: "Message Chain Retrieved!",
            posts: documents
          });
        }
      });

    //   .exec((err, locations) => {
    //     if (err) throw err;
    //     console.log(locations);
    // });
  } else if (req.query.creator) {
    query = { creator: req.query.creator };
    inbox = false;
    Messages.find(query)
      .populate("creator", "instagramName")
      .then(documents => {
        if (inbox === false && messageId === false) {
          res.status(200).json({
            message: "User's Sent Messages Retrieved!",
            posts: documents
          });
        }
        if (inbox === true) {
          res.status(200).json({
            message: "User's Inbox Retrieved!",
            posts: documents
          });
        }
        if (messageId === true) {
          res.status(200).json({
            message: "Message Chain Retrieved!",
            posts: documents
          });
        }
      });
  } else if (req.query.messageId) {
    query = { messageTrackingId: req.query.messageId };
    console.log(req.query.messageId);
    messageId = true;
    console.log("MESSAGE ID IS TRUE");
    Messages.find(query)
      .populate("creator", "instagramName")
      .then(documents => {
        if (inbox === false && messageId === false) {
          res.status(200).json({
            message: "User's Sent Messages Retrieved!",
            posts: documents
          });
        }
        if (inbox === true) {
          res.status(200).json({
            message: "User's Inbox Retrieved!",
            posts: documents
          });
        }
        if (messageId === true) {
          res.status(200).json({
            message: "Message Chain Retrieved!",
            posts: documents
          });
        }
      });
  }
});

app.post

app.post("/api/messages", checkAuth, (req, res, next) => {
  console.log("Made It")
  messagingTrackingIDValue = "";

  const messaging = new Messages({
    creator: req.userData.userId,
    recipient: req.body.recipient,
    recipientId: req.body.recipientId,
    message: req.body.message,
    //message: req.body.message,
    messageTrackingId: req.body.messageTrackingId,
    creatorName: req.userData.username,
    creationDate: req.body.creationDate
  });

  //saves to database with mongoose
  messaging.save().then(result => {
    if (result.creator !== messaging.creator) {
    } else if (result.creator === req.userData.userId) {
    }
    console.log(result);
    res.status(201).json({
      message: "Message Sent Successfully!",
      postId: result._id
    });
  });
});

角度服务

  sendMessage(
    recipient: string,
    message: string,
    creationDate: Date,
    recipientId: string,
    creatorName: string,
    messageTrackingId: string
  ) {
    const messaging: Messages = {
      id: null,
      recipient: recipient,
      message: message,
      creationDate: creationDate,
      creator: null,
      recipientId: recipientId,
      creatorName: creatorName,
      messageTrackingId: messageTrackingId
    };

    this.http
      .post<{ message: string; messagingId: string; creator: string }>(
        "http://localhost:3000/api/messages",
        messaging
      )
      .subscribe(responseData => {
        console.log(responseData);
        const id = responseData.messagingId;
        messaging.id = id;

        console.log("Message sent successfully!");

        //   window.location.reload();
        //  this.posts.push();
        //  this.postsUpdated.next([...this.posts]);
      });
  }




  replyToMessage(
    recipient: string,
    message: string,
    creationDate: Date,
    recipientId: string,
    creatorName: string,
    messageTrackingId: string
  ) {
    const messaging: Messages = {
      id: null,
      recipient: recipient,
      message: message,
      creationDate: creationDate,
      creator: null,
      recipientId: recipientId,
      creatorName: creatorName,
      messageTrackingId: messageTrackingId
    };

    this.http
      .post<{ message: string; messagingId: string; creator: string }>(
        "http://localhost:3000/api/messages",
        messaging
      )
      .subscribe(responseData => {
        console.log(responseData);
        const id = responseData.messagingId;
        messaging.id = id;

        console.log("Message sent successfully!");
      });
  }







  getMessages(recipientId: string) {
    return this.http
      .get<{
        message: string;
        posts: any;
        maxPosts: number;
        messageList: string;
      }>("http://localhost:3000/api/messages?recipientId=" + recipientId)
      .pipe(
        map(retrievedData => {
          return {
            posts: retrievedData.posts.map(post => {
              return {
                creator: post.creator,
                recipientId: post.recipientId,
                creationDate: post.creationDate,
                messageTrackingId: post.messageTrackingId,
                creatorName: post.creatorName,
                id: post._id
              };
            }),
            maxPosts: retrievedData.maxPosts
          };
        })
      );
  }

这是收件人回复邮件的示例,以便发件人可以使用messageTrackingId

首先发送消息,然后回复消息。由于收件人已回复,因此发件人具有messageTrackingId,可用于向同一用户发送下一封邮件。

Made It
{ _id: 5e0674ddd55aae5294370870,
  creator: 5df0014e25ee451beccf588a,
  recipient: 'joe',
  recipientId: '5df00d08c713f722909c99c1',
  message: 'This is the initial message',
  messageTrackingId: '3cb3f5bb-5e17-49a7-8aca-4a61ddd1d847',
  creatorName: 'andy',
  creationDate: 2019-12-27T21:17:17.155Z,
  __v: 0 }
Made It
{ _id: 5e067529d55aae5294370872,
  creator: 5df00d08c713f722909c99c1,
  recipient: 'andy',
  recipientId: '5df0014e25ee451beccf588a',
  message: 'This is the reply message',
  messageTrackingId: '3cb3f5bb-5e17-49a7-8aca-4a61ddd1d847',
  creatorName: 'joe',
  creationDate: 2019-12-27T21:18:33.947Z,
  __v: 0 }

如果收件人从不答复,而发件人发送另一条消息,则会发生:

Made It
{ _id: 5e06756bd55aae5294370873,
  creator: 5df00d08c713f722909c99c1,
  recipient: 'andy',
  recipientId: '5df0014e25ee451beccf588a',
  message: 'This is the first message',
  messageTrackingId: '2077a8e6-844c-4639-a4fa-7aee0b8beaf4',
  creatorName: 'joe',
  creationDate: 2019-12-27T21:19:39.217Z,
  __v: 0 }
Made It
{ _id: 5e06757cd55aae5294370874,
  creator: 5df00d08c713f722909c99c1,
  recipient: 'andy',
  recipientId: '5df0014e25ee451beccf588a',
  message: 'This is another message to same user.',
  messageTrackingId: 'feeb0e20-432e-4c9a-9f59-45913c194edc',
  creatorName: 'joe',
  creationDate: 2019-12-27T21:19:56.257Z,
  __v: 0 }
node.js angular mongodb express mongoose
1个回答
0
投票

您可以使用下面的汇总来确保每对(recipientsender)对仅返回一个文档:

db.Messages.aggregate([
    {
        $addFields: { conversants: [ "$recipientId", "$creator" ] }
    },
    {
        $match: { conversants: req.query.recipientId }
    },
    {
        $addFields: { conversant: { $arrayElemAt: [ { $filter: { input: "$conversants", cond: { $ne: [ "$$this", "5df0014e25ee451beccf588a" ] } }  } , 0 ] } }
    },
    {
        $sort: { creationDate: 1 }
    },
    {
        $group: {
            _id: "$conversant",
            message: { $first: "$message" },
            recipientId: { $first: "$recipientId" },
            creator: { $first: "$creator" },
            messageTrackingId: { $first: "$messageTrackingId" },
            creationDate: { $first: "$creationDate" }
        }
    },
    {
        $lookup: {
            from: "users",
            localField: "creator",
            foreignField: "_id",
            as: "creatorName"
        }
    }
])

这里的想法是您创建代表两个ID的附加字段:creatorrecipient。这将使您能够做两件事:使用recipientId(可能也是发送者)进行过滤-第二步,并选择始终为第二个人的conversant值-无论您的请求中指定的人是发送还是在该对话中收到一条消息。然后,您可以在该字段上单击$group,以确保在每次“会话”中仅收到一条消息。不用将$addToSet$arrayElemAt一起使用,您只需运行$first。相对较重的$lookup也可以作为最后一步运行,因为您需要为每个“对话者”获取一次数据。

© www.soinside.com 2019 - 2024. All rights reserved.