如何解决聚合查询上的Mongodb填充字段
我有这三个收藏集(产品,用户和评论)
1。产品型号
var ProductSchema = new Schema({
title: { type: String,text: true,required: true },description: { type: String,category: [{ type: String,required: true }],type: [{ type: String,isUsed: { type: Boolean,},manufacturer: { type: String },price: { type: Number },});
2。用户模型
var UserSchema = new Schema({
firstName: { type: String,lastName: { type: String,country: [{ type: String,phoneNumber: [{ type: String,required: true }]
});
3。评论模型
var CommentSchema = new Schema({
comment: { type: String,commented_by: { type: Schema.Types.ObjectId,ref: 'User',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",{
"comment": "Great,I like it!","commented_by": "5f992b5338f5f035f35911c8","commented_on": "5f992b5338f5f035f35911c5"
}
],"hasCommented": true,"comments_no": 3
}
预期结果
{
"_id": "5f992b5338f5f035f35911c5","commented_by": {
"_id": "5f992b5338f5f035f35911b2","firstName": "Jack","lastName": "Sparrow"
},"commented_by": {
"_id": "5f992b5338f5f035f35911a2","firstName": "John","lastName": "Doe"
},"commented_by": {
"_id": "5f992b5338f5f035f35911c8","firstName": "Mary","lastName": "Jane"
},"comments_no": 3
}
获取特定产品时,我现在可以列出该产品的评论,但是问题出在“ commented_by”部分上所有列出的评论上,我需要填充它(需要firstName,lastName ...)字段
任何想法我该怎么做?
解决方法
您所做的是正确的。在Product
和Comment
之间进行查找之后,还需要进行另一个查找才能加入User
。
您需要添加以下步骤来实现目标
-
unwind
以取消结构化comments[]
数组 -
lookup
加入User
集合 - 由于查找提供了一个数组,因此我们可以在安全运算符
$arrayElemAt
的帮助下使用$ifNull
获取数组的第一个元素。 (如果comments []
为空,则脚本将引发错误。为处理此问题,我们使用$ifNull
) - 我们已经取消了数组的结构,
group
帮助重新组合了数组
阶段在下面给出
{
$unwind: "$comments"
},{
$lookup: {
from: "User",let: {
id: "$comments.commented_by"
},pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id","$$id"
]
}
}
},],as: "comments.commented_by"
}
},{
$addFields: {
"comments.commented_by": {
$ifNull: [
{
$arrayElemAt: [
"$comments.commented_by",0
]
},{}
]
}
}
},{
$group: {
_id: "$_id",title: {
$first: "$title"
},hasCommented: {
$first: "$hasCommented"
},comments: {
$push: "$comments"
}
}
}
注意:仅供参考,变量和集合名称可能不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。