gpt4 book ai didi

javascript - 在 MongoDB 中实现带有转发的 feed

转载 作者:行者123 更新时间:2023-12-02 21:55:25 25 4
gpt4 key购买 nike

我想在我的应用程序中实现转发功能。我使用 Mongoose 并拥有 UserMessage 模型,并将转发存储为 {userId,createdAt}< 类型的对象数组 其中 createdAt 是转发发生的时间。消息模型有自己的createdAt字段。

我需要创建基于 createdAt 字段合并在一起的原始消息和转发消息的提要。我被合并困扰,无论是在单个查询中进行合并还是单独并在 JavaScript 中进行合并。我可以通过一次查询在 Mongoose 中完成所有操作吗?如果不是,如何找到合并插入点和最后一条消息的索引?

到目前为止,我只获取了原始消息。

我的消息模型:

const messageSchema = new mongoose.Schema(
{
fileId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'File',
required: true,
},
userId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
required: true,
},
likesIds: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
reposts: [
{
reposterId: {
type: mongoose.Schema.Types.ObjectId,
ref: 'User',
},
createdAt: { type: Date, default: Date.now },
},
],
},
{
timestamps: true,
},
);

编辑:现在我有了这个,但分页已损坏。我正在尝试使用 newCreatedAt 字段作为光标,但这似乎不起作用。当从前端传递 newCreatedAt 时,它会在第二次调用中返回空数组。

  messages: async (
parent,
{ cursor, limit = 100, username },
{ models },
) => {
const user = username
? await models.User.findOne({
username,
})
: null;

const options = {
...(cursor && {
newCreatedAt: {
$lt: new Date(fromCursorHash(cursor)),
},
}),
...(username && {
userId: mongoose.Types.ObjectId(user.id),
}),
};

console.log(options);

const aMessages = await models.Message.aggregate([
{
$addFields: {
newReposts: {
$concatArrays: [
[{ createdAt: '$createdAt', original: true }],
'$reposts',
],
},
},
},
{
$unwind: '$newReposts',
},
{
$addFields: {
newCreatedAt: '$newReposts.createdAt',
original: '$newReposts.original',
},
},
{ $match: options },
{
$sort: {
newCreatedAt: -1,
},
},
{
$limit: limit + 1,
},
]);

const messages = aMessages.map(m => {
m.id = m._id.toString();
return m;
});
//console.log(messages);

const hasNextPage = messages.length > limit;
const edges = hasNextPage ? messages.slice(0, -1) : messages;

return {
edges,
pageInfo: {
hasNextPage,
endCursor: toCursorHash(
edges[edges.length - 1].newCreatedAt.toString(),
),
},
};
},

以下是查询。工作中的:

Mongoose: messages.aggregate([{
'$match': {
createdAt: {
'$lt': 2020 - 02 - 02 T19: 48: 54.000 Z
}
}
}, {
'$sort': {
createdAt: -1
}
}, {
'$limit': 3
}], {})

以及无效的:

Mongoose: messages.aggregate([{
'$match': {
newCreatedAt: {
'$lt': 2020 - 02 - 02 T19: 51: 39.000 Z
}
}
}, {
'$addFields': {
newReposts: {
'$concatArrays': [
[{
createdAt: '$createdAt',
original: true
}], '$reposts'
]
}
}
}, {
'$unwind': '$newReposts'
}, {
'$addFields': {
newCreatedAt: '$newReposts.createdAt',
original: '$newReposts.original'
}
}, {
'$sort': {
newCreatedAt: -1
}
}, {
'$limit': 3
}], {})

最佳答案

这可以在一个查询中完成,尽管它有点黑客风格:

db.collection.aggregate([
{
$addFields: {
reposts: {
$concatArrays: [[{createdAt: "$createdAt", original: true}],"$reports"]
}
}
},
{
$unwind: "$reposts"
},
{
$addFields: {
createdAt: "$reposts.createdAt",
original: "$reposts.original"
}
},
{
$sort: {
createdAt: -1
}
}
]);

您可以使用 original 字段向查询添加任何其他逻辑,带有 original: true 的文档是原始帖子,而其他文档是转发帖子。

关于javascript - 在 MongoDB 中实现带有转发的 feed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60025851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com