gpt4 book ai didi

node.js - Mongodb - 通过嵌入文档 id 聚合覆盖外部文档 _id

转载 作者:可可西里 更新时间:2023-11-01 10:03:54 28 4
gpt4 key购买 nike

我有这种“评论”模型:

{ _id: <comment-id>,
user: {
id: { type: Schema.ObjectId, ref: 'User', required: true },
name: String
},
sharedToUsers: [{ type: Schema.ObjectId, ref: 'User' }],
repliedToUsers: [{ type: Schema.ObjectId, ref: 'User' }],
}

我想查询所有满足以下条件的评论:

  1. sharedToUsers 数组为空
  2. repliedToUsers 数组为空

而且,我希望结果按用户 ID 仅包含每个用户的 1 条评论(最新评论)。

我已尝试创建此聚合(Node.js、 Mongoose ):

     Comment.aggregate(
{ $match: { "sharedToUsers": [], "repliedToUsers": [] } },
{
$group: {
_id: "$user.id",
user: { $first: "$user" },
}
},
function (err, result) {
console.log(result);
if (!err) {
res.send(result);
} else {
res.status(500).send({err: err});
}
});

它确实有效,但严重的问题是结果评论_id 字段被嵌套用户_id 覆盖。

我怎样才能保持聚合工作但不覆盖原始评论 _id 字段?

谢谢

最佳答案

好的,我有办法。

我只想按 _id 分组,但返回带有 _id 字段的结果文档(使用 $group 运算符时会被覆盖)。

我所做的就像 wdberkley 所说的那样,我添加了 comment_id : { "$first": "$_id"} 但后来我不想返回 comment_id 字段(因为它不适合我的模型)所以我已经创建了一个 $project,它将 comment_id 放在常规的 _id 字段中。

基本上是这样的:

Comment.aggregate(
{
$match: {
"sharedToUsers": [], "repliedToUsers": []
}
},
{
$group: {
comment_id: { $last: "$_id" },
_id: "$user.id",
content: { $last: "$content" },
urlId: { $last: "$urlId" },
user: { $last: "$user" }
}
},
{
$project: {
_id: "$comment_id",
content: "$content",
urlId: "$urlId",
user: "$user"
}
},
{ $skip: parsedFromIndex },
{ $limit: (parsedNumOfComments - parsedFromIndex) },
function (err, result) {
console.log(result);
if (!err) {
Comment.populate(result, { path: "urlId"}, function(err, comments) {
if (!err) {
res.send(comments);
} else {
res.status(500).send({err: err});
}
});
} else {
res.status(500).send({err: err});
}
});

谢谢 wdbkerkley!

关于node.js - Mongodb - 通过嵌入文档 id 聚合覆盖外部文档 _id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28906998/

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