【发布时间】:2021-02-16 00:37:40
【问题描述】:
我有这三个集合(产品、用户和评论)
1.产品型号
var ProductSchema = new Schema({
title: { type: String, text: true, required: true },
description: { type: String, required: true },
category: [{ type: String, required: true }],
type: [{ type: String, required: true }],
isUsed: { type: Boolean, },
manufacturer: { type: String },
price: { type: Number },
});
2。用户模型
var UserSchema = new Schema({
firstName: { type: String, text: true, required: true },
lastName: { type: String, text: true, required: true },
country: [{ type: String, required: true }],
phoneNumber: [{ type: String, required: true }]
});
3。评论模型
var CommentSchema = new Schema({
comment: { type: String, text: true, required: true },
commented_by: { type: Schema.Types.ObjectId, ref: 'User', required: true },
commented_on: { type: Schema.Types.ObjectId, ref: 'Product', required: true }
});
然后,当发送请求以获取特定的产品时,这就是在后台运行的猫鼬代码。
var aggregate = Product.aggregate([
{ "$match": { _id: ObjectId(req.params.id) } }, /** which is the product id **/
{ "$limit": 1 },
{
$lookup: {
from: 'comments',
let: { id: "$_id" },
pipeline: [
{ $match: { $expr: { $eq: [ "$commented_on.product", "$$id" ] } } },
],
as: "comments"
}
},
{
$addFields: {
comments: "$comments",
comments_no: { $size: "$comments" },
hasCommented: { $in: [ObjectId(req.user._id), "$comments.commented_by" ] }, /** req.user._id is the user's id **/
}
},
{
$project: {
_id: 1,
title: 1,
description: 1,
category: 1,
type: 1,
price: 1,
comments: 1,
hasCommented: 1,
comments_no: 1,
}
}
]);
输出
{
"_id": "5f992b5338f5f035f35911c5",
"title": "Some title here..."
"description": Some description here ...
"price": 1000,
"category": "Clothing",
"type": "shoe",
"comments": [
{
"comment": "Nice Product",
"commented_by": "5f992b5338f5f035f35911b2",
"commented_on": "5f992b5338f5f035f35911c5"
},
{
"comment": "I like this product",
"commented_by": "5f992b5338f5f035f35911a2",
"commented_on": "5f992b5338f5f035f35911c5"
},
{
"comment": "Great, I like it!",
"commented_by": "5f992b5338f5f035f35911c8",
"commented_on": "5f992b5338f5f035f35911c5"
}
],
"hasCommented": true,
"comments_no": 3
}
预期结果
{
"_id": "5f992b5338f5f035f35911c5",
"title": "Some title here..."
"description": Some description here ...
"price": 1000,
"category": "Clothing",
"type": "shoe",
"comments": [
{
"comment": "Nice Product",
"commented_by": {
"_id": "5f992b5338f5f035f35911b2",
"firstName": "Jack",
"lastName": "Sparrow"
},
"commented_on": "5f992b5338f5f035f35911c5"
},
{
"comment": "I like this product",
"commented_by": {
"_id": "5f992b5338f5f035f35911a2",
"firstName": "John",
"lastName": "Doe"
},
"commented_on": "5f992b5338f5f035f35911c5"
},
{
"comment": "Great, I like it!",
"commented_by": {
"_id": "5f992b5338f5f035f35911c8",
"firstName": "Mary",
"lastName": "Jane"
},
"commented_on": "5f992b5338f5f035f35911c5"
}
],
"hasCommented": true,
"comments_no": 3
}
获得特定产品时,我现在可以列出该产品的 cmets,但问题出在“commented_by”部分中所有列出的 cmets 上,我需要填充它(需要 firstName、lastName...)字段用它。
知道我该怎么做吗?
【问题讨论】:
-
这是否回答了您的问题:stackoverflow.com/questions/61514375/… ?
标签: mongodb mongoose nosql aggregation-framework