如何在没有“as”字段猫鼬的情况下进行查找后投影

Posted

技术标签:

【中文标题】如何在没有“as”字段猫鼬的情况下进行查找后投影【英文标题】:How to project after lookup without the 'as' field mongoose 【发布时间】:2021-10-22 20:48:15 【问题描述】:

我有以下代码:

     const products: ReadonlyArray<Pick<IProduct, 'id' | 'gender' | 'category' | 'title' | 'description' | 'price' | 'imageFileName'>> = await UserDB.aggregate<
        Pick<IProduct, 'id' | 'gender' | 'category' | 'title' | 'description' | 'price' | 'imageFileName'>>([
          
            $match:  _id: mongoose.Types.ObjectId(req.userId) ,
          ,
          
            $lookup: 
              from: 'products',
              localField: 'inBagProducts',
              foreignField: '_id',
              as: 'product',
            ,
          ,
          
            $unwind: '$product',
          ,
          
            $project:  
              product: 
                'product.category': 1,
                'product.gender': 1,
                'product.title': 1,
                'product.description': 1,
                'product.price': 1,
                'product.imageFileName': 1,
              
            ,
          ,
        ]);

这段代码给出了这样的结果:

    
        _id: 611e2febb863ce74ac448220,
        product: 
          category: 1,
          gender: 2,
          title: 'jdwoeid',
          description: 'jfwoeifjweoi',
          price: 23902,
          imageFileName: '1628808613195-7886.png'
        
      ,
      
        _id: 611e2febb863ce74ac448220,
        product: 
          category: 5,
          gender: 1,
          title: 'sivdosi',
          description: 'oisbdvoi',
          price: 2394,
          imageFileName: 'http://localhost:3000/images/1628875244435-3564.png'
        
      

预期结果是这样的:

      
        _id: 611e2febb863ce74ac448220,
          category: 1,
          gender: 2,
          title: 'jdwoeid',
          description: 'jfwoeifjweoi',
          price: 23902,
          imageFileName: '1628808613195-7886.png'
      ,
      
        _id: 611e2febb863ce74ac448220,
          category: 5,
          gender: 1,
          title: 'sivdosi',
          description: 'oisbdvoi',
          price: 2394,
          imageFileName: 'http://localhost:3000/images/1628875244435-3564.png'
      

没有product: 我怎么能得到结果

【问题讨论】:

【参考方案1】:

您可以使用$addFields 管道将_id 添加到product 属性,然后您可以使用$replaceRoot 管道。您可以将这些聚合阶段添加到您的代码中:

[
  
    "$addFields": 
      "product._id": "$_id"
    
  ,
  
    "$replaceRoot": 
      "newRoot": "$product"
    
  
]

下面是工作示例:https://mongoplayground.net/p/VVxXgDYFANI

【讨论】:

以上是关于如何在没有“as”字段猫鼬的情况下进行查找后投影的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用猫鼬的查找查询中使用排序

根据打字稿中的请求参数设置猫鼬的查询过滤器

如何在猫鼬的嵌入式文档中填充字段?

从猫鼬的多个集合中获取数据?

具有多个和可选字段的猫鼬查找

如何处理异步。护照和猫鼬的 findOrCreate 方法