- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当用户发送消息时,会生成一个messageTrackingId。现在它 $unwinds CreatorName 作为收件箱中唯一的返回值。我只想要一个用户条目。同一用户不存在重复项。目前,如果其他用户没有响应,他们可以发送多条消息,从而生成新的 messageTrackingIds。如何使初始发送的消息也出现在收件箱中,以便我可以使用该 messageTrackingId 而不是生成新消息?我已经被困在这个问题上有一段时间了,所以我感谢任何帮助。
应用程序获取
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([
{
$match: {
$or: [ { recipientId: req.query.recipientId }, { creator: req.query.recipientId } ]
}
},
{
$addFields: {
conversant: {
$cond: [ { $ne: [ "$recipientId", req.query.recipientId ] }, "$recipientId", "$creator" ]
}
}
},
{
$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",
pipeline: [
{
$project: {
_id: 1,
message: { $arrayElemAt: ["$message", 0] },
recipientId: { $arrayElemAt: ["$recipientId", 0] },
creator: { $arrayElemAt: ["$creator", 0] },
messageTrackingId: { $arrayElemAt: ["$messageTrackingId", 0] },
creatorName: { $arrayElemAt: ["$creatorName", 0] },
}
}
],
as: 'messageTest'
},
}
])
//.populate('creator', 'username')
.then(documents => {
if (res.subject === "Test") {
}
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.creator) {
query = { creator: req.query.creator };
inbox = false;
Messages.find(query)
.populate("creator", "username")
.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 };
messageId = 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
});
}
});
}
});
应用程序.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
});
});
});
Angular 服务
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 }
最佳答案
您可以使用以下聚合来确保每个(收件人
,发件人
)对仅返回一个文档:
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",
let: { creator: "$creator" },
pipeline: [
{ $match: { $expr: { $eq: [ "$_id", "$$creator" ] } } },
{ $project: { creatorName: 1 } }
],
as: "creatorName"
}
},
{
$addFields: { creatorName: { $arrayElemAt: [ "$creatorName", 0 ] } }
}
])
这里的想法是创建代表两个 ID 的附加字段:creator
和 recipient
。这将允许您执行两件事:使用 recipientId
(也可能是发件人)进行过滤 - 第二步,然后选择始终是第二人的 conversant
值 - 否如果您的请求中指定的人在该对话中发送或接收了消息,则很重要。然后您可以在该字段上 $group
以确保您在每个“对话”中只收到一条消息。您可以只运行 $first
,而不是将 $addToSet
与 $arrayElemAt
一起使用。相对繁重的 $lookup
也可以作为最后一步运行,因为您需要为每个“熟悉的人”获取一次该数据。
编辑:前三个阶段可以替换为以下阶段 - 这应该会显着提高性能,因为过滤将尽快应用:
{
$match: {
$or: [ { recipientId: req.query.recipientId }, { creator: req.query.recipientId } ]
}
},
{
$addFields: {
conversant: {
$cond: [ { $ne: [ "$recipientId", req.query.recipientId ] }, "$recipientId", "$creator" ]
}
}
},
关于node.js - GET 不返回发送的消息。仅收件箱项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503094/
我正在学习构建单页应用程序 (SPA) 所需的所有技术。总而言之,我想将我的应用程序实现为单独的层,其中前端仅使用 API Web 服务(json 通过 socket.io)与后端通信。前端基本上是
当我看到存储在我的数据库中的日期时。 这是 正常 。日期和时间就是这样。 但是当我运行 get 请求来获取数据时。 此格式与存储在数据库 中的格式不同。为什么会发生这种情况? 最佳答案 我认为您可以将
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用backbone.js 实现一些代码 和 hogan.js (http://twitter.github.com/hogan.js/) Hogan.js was developed ag
我正在使用 Backbone.js、Node.js 和 Express.js 制作一个 Web 应用程序,并且想要添加用户功能(登录、注销、配置文件、显示内容与该用户相关)。我打算使用 Passpor
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我尝试在 NodeJS 中加载数据,然后将其传递给 ExpressJS 以在浏览器中呈现 d3 图表。 我知道我可以通过这种方式加载数据 - https://github.com/mbostock/q
在 node.js 中,我似乎遇到了相同的 3 个文件名来描述应用程序的主要入口点: 使用 express-generator 包时,会创建一个 app.js 文件作为生成应用的主要入口点。 通过 n
最近,我有机会观看了 john papa 关于构建单页应用程序的精彩类(class)。我会喜欢的。它涉及服务器端和客户端应用程序的方方面面。 我更喜欢客户端。在他的实现过程中,papa先生在客户端有类
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一个图形新手,需要帮助了解各种 javascript 2D 库的功能。 . . 我从 Pixi.js 中得到了什么,而我没有从 Konva 等基于 Canvas 的库中得到什么? 我从 Konva
我正在尝试将一些 LESS 代码(通过 ember-cli-less)构建到 CSS 文件中。 1) https://almsaeedstudio.com/ AdminLTE LESS 文件2) Bo
尝试查看 Express Passport 中所有登录用户的所有 session ,并希望能够查看当前登录的用户。最好和最快的方法是什么? 我在想也许我可以在登录时执行此操作并将用户模型数据库“在线”
我有一个 React 应用程序,但我需要在组件加载完成后运行一些客户端 js。一旦渲染函数完成并加载,运行与 DOM 交互的 js 的最佳方式是什么,例如 $('div').mixItUp() 。对
请告诉我如何使用bodyparser.raw()将文件上传到express.js服务器 客户端 // ... onFilePicked(file) { const url = 'upload/a
我正在尝试从 Grunt 迁移到 Gulp。这个项目在 Grunt 下运行得很好,所以我一定是在 Gulp 中做错了什么。 除脚本外,所有其他任务均有效。我现在厌倦了添加和注释部分。 我不断收到与意外
我正在尝试更改我的网站名称。找不到可以设置标题或应用程序名称的位置。 最佳答案 您可以在 config/ 目录中创建任何文件,例如 config/app.js 包含如下内容: module.expor
经过多年的服务器端 PHP/MySQL 开发,我正在尝试探索用于构建现代 Web 应用程序的新技术。 我正在尝试对所有 JavaScript 内容进行排序,如果我理解得很好,一个有效的解决方案可以是服
我是 Nodejs 的新手。我在 route 目录中有一个 app.js 和一个 index.js。我有一个 app.use(multer....)。我还定义了 app.post('filter-re
我正在使用 angular-seed用于构建我的应用程序的模板。最初,我将所有 JavaScript 代码放入一个文件 main.js。该文件包含我的模块声明、 Controller 、指令、过滤器和
我是一名优秀的程序员,十分优秀!