Node.js Mongodb-按嵌入文档id聚合覆盖外部文档\u id
我有这种“评论”模式:Node.js Mongodb-按嵌入文档id聚合覆盖外部文档\u id,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有这种“评论”模式: { _id: <comment-id>, user: { id: { type: Schema.ObjectId, ref: 'User', required: true }, name: String }, sharedToUsers: [{ type: Schema.ObjectId, ref: 'User' }], repliedToUsers: [{ type: Schema.Objec
{ _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' }],
}
它实际上正在工作,但严重的问题是结果注释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});
}
});
谢谢你 将注释
\u id
推送到组结果中,就像对待用户那样,例如注释id:{“$first”:“$\u 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});
}
});