Javascript 如何填充Id';它与$lookup一起使用

Javascript 如何填充Id';它与$lookup一起使用,javascript,node.js,database,mongodb,mongoose,Javascript,Node.js,Database,Mongodb,Mongoose,我正在尝试查找用户上传的给定项目的所有评论。我想在我的用户配置文件页面中显示他所有上传产品的列表,并为每个项目显示一些评论。为了实现这一点,我试图按项目对所有评论进行分组。首先,我尝试使用聚合,以便按项目对所有评论进行分组,然后,我希望在聚合结果中填充该项目,以便获得一些字段,如标题和评级。此外,我正在尝试填充reviews.user,因为我必须获得撰写评论的用户名。这不是一个困难的查询,但是$lookup的语法阻止了我实现这一点。提前谢谢你的帮助 我有这些模式 const reviewSche

我正在尝试查找用户上传的给定项目的所有评论。我想在我的用户配置文件页面中显示他所有上传产品的列表,并为每个项目显示一些评论。为了实现这一点,我试图按项目对所有评论进行分组。首先,我尝试使用聚合,以便按项目对所有评论进行分组,然后,我希望在聚合结果中填充该项目,以便获得一些字段,如标题和评级。此外,我正在尝试填充reviews.user,因为我必须获得撰写评论的用户名。这不是一个困难的查询,但是$lookup的语法阻止了我实现这一点。提前谢谢你的帮助

我有这些模式

const reviewSchema = new Schema(
    {
            text: { type: String, max: [400, 'Too long, max is 400 characters']},
            createdAt: { type: Date, default: Date.now },
            rating : { type: Number },
            user: {type: Schema.Types.ObjectId, ref:'User'},//User who wrote review
            item: {type: Schema.Types.ObjectId, ref:'Item', default: null},// Review belongs to this item
    });

const userSchema = new Schema(
    {
            username: { type: String, max: [20, 'Too long, max is 20 characters']},
            createdAt: { type: Date, default: Date.now },
            rating : { type: Number },
            email: { type: Number },
            items: [{type: Schema.Types.ObjectId, ref:'Item'}]
            // Some more info
    });


const itemSchema = new Schema(
    {
            title: { type: String, max: [40, 'Too long, max is 40 characters']},
            rating: { type: number },
            user : {type: Schema.Types.ObjectId, ref:'User'},
            // Some more info
    });
在注意到必须在聚合管道中填充数组之前,我已经达到了这一步

  const resolvedItemReviews = await Promise.all(user.items.map(async (rental) =>{
      return new Promise((resolve, reject) => 
      {
      Review.aggregate([
                   { "$match": {$and: [
                                       {item: item._id}, 
                                       {_id: { $nin: queryObj.seenIDs }}
                                   ]}},
                       { '$limit' : 5},
                       { "$sort": { "createdAt": 1 } },
                       { "$group": { 
                               "_id": "$item",
                               "item": {'$first': '$item'},
                               "reviews": { $push: {"text": "$text","user": "$user","rating": "$rating" ,"createdAt": "$createdAt"} },
                                }
                            },
                            // unwind source
                            {"$unwind": "$reviews"},
                            { "$lookup": {
                                "from": "User",
                                "localField": "reviews.user",
                                "foreignField": "_id",
                                "as": "reviewUser"
                            }},
                            { "$unwind": "$reviewUser" },
                        ],
                        async function(err,results) {
                            if (err) reject(err);
                            console.log(results)

                            await Item.populate(results, { "path": "rental", select: 'title image rating'})
                            resolve( results )
                    })
                });
            })
我目前得到的结果是:

[ { _id: 5c94061acd2e4e50a4e921aa,
item: 5c94061acd2e4e50a4e921aa,
reviews:
 { text:
    'Lorem ipsum dolor sit amet',
   user: 5c1c774ccc273b1584925b9d,
   rating: 5,
   createdAt: 2019-03-21T21:49:03.510Z } },
  { _id: 5c94061acd2e4e50a4e921aa,
item: 5c94061acd2e4e50a4e921aa,
reviews:
 { text:
    'Lorem ipsum dolor sit amet,',
   user: 5c5a3cb031c62708c4143f82,
   rating: 5,
   createdAt: 2019-03-21T22:10:10.013Z } } ]
这将是一个预期的结果

[ { _id: 5c940eb1c1d32b4fdc5c7ef4,
item: {
  _id: 5c940eb1c1d32b4fdc5c7ef4
  title: "Item title text",
  rating: 4.3,
  image: "https://www.imageurl.com",
},
reviews:
 { text: 'Some review text',
   user: {
     username: "TestUser",
     rating: 4.6,
     image: "https://www.user-imageurl.com",
   },
   rating: 4,
   createdAt: 2019-03-21T22:23:59.105Z } 
  },

 { text: 'Some review text from another user',
   user: {
     username: "TestUser 2",
     rating: 3.1,
     image: "https://www.user2-imageurl.com",
   },
   rating: 3,
   createdAt: 2019-02-21T22:23:59.105Z } 
   }
 ]

什么是
user
user.items
?你为什么要保证整个结果?而且
async
函数本身会返回承诺,您不需要使用
newpromise(…)
。这里有很多计算错误。这里的
user
user.items
是什么?你为什么要保证整个结果?而且
async
函数本身会返回承诺,您不需要使用
newpromise(…)
。这里发生了很多误判。