【问题标题】:Mongoose GroupBy with PopulateMongoose GroupBy 与 Populate
【发布时间】:2020-09-04 00:24:02
【问题描述】:

我有用户文档和与商店文档相关的类别文档,看起来像

  var ShopSchema = mongoose.Schema(
  {
    shopName: {
      type: String,
      required: [true, 'A Shop must have name'],
    },
    phone: {
        type: String,
        validate: [validator.isMobilePhone,"Phone number is not a valid number"],
        required: [true, 'A Shop must have hepline number'],
    },
    shopStatus: {
        type: Boolean,
        default: false,
        select: false
    },
    managerId:{
        type: mongoose.Schema.ObjectId,
        ref:'User',
        require: [true,'Shop must have to a manager!']
    },
    createdAt:{
        type:Date,
        default: Date.now()
    },
    shopCategory:{
        type: mongoose.Schema.ObjectId,
        ref:'Category',
        require: [true,'Shop must have a Category!']
    },

  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true }
  }
);

const Shop = mongoose.model("Shop", ShopSchema);
  

现在我正在编写一个查询来获取经理商店(groupBy managerId),其中包含经理和类别数据。但我每次都得到空数组。

 const doc = await Shop.aggregate([
        { 
            $match: { shopStatus: {$ne: false} } 
        },
        { 
            $group: {
                _id:'$managerId',
                numofShop: {$sum: 1},
                shopCategory: {$first: "$shopCategory"}
            }
        },
        { 
            $lookup: {
               from: "User",
               localField : "_id",
               foreignField: "_id",
               as: "Manager"
             }
       },
       { 
            $lookup: {
                from: "Category",
                localField : "shopCategory",
                foreignField: "_id",
                as: "Category"
            }
       },
     ])

这是我的最终结果,但这是一个空数组。

        {
            "_id": "5f467660f630e804ec07fad8",
            "numofShop": 2,
            "Manager": [],
            "Category": []
        },
        {
            "_id": "5f44d2f4ff04993b40684bf9",
            "numofShop": 1,
            "Manager": [],
            "Category": []
        }

我想查找所有商店 groupBy managerId(谁拥有它)。 managerId 的字段引用了创建此商店的用户文档。我想要这样的数据

    {
        "_id": "5f44d2f4ff04993b40684bf9",
        "Manager": {},//this is populated through User Schema
        "numofShop": 1,
        "Shop": [
                  { 
                     "shopName":"Grocery Shop",
                     "phone" : "111111",
                     "shopCategory" :{"_id": "","name":"Electronics"}
                  }
                ]
    }
    .....
    .....

在此处查找示例数据 商店-http://txt.do/1fwi0 两个用户创建的 3 个商店 用户 - http://txt.do/1fwio 分类-http://txt.do/1fwij

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    有 2 个修复,

    • 在第二次查找中,您在 localField 中没有 shopCategory 字段,因为您尚未在 $group 中定义 shopCategory
    { 
      $group: {
        _id:'$managerId',
        numofShop: {$sum: 1},
        shopCategory: { $first: "$shopCategory" } // define here
      }
    },
    
    • 在第一次查找用户集合时,没有managerId字段并且您已在_id字段中分配,那么您可以在localField中使用_id
    {
      $lookup: {
        from: "User",
        localField : "_id", // change this from managerId
        foreignField: "_id",
        as: "Manager"
      }
    },
    

    更新问题后更新的东西,Playground1Playground2


    对于您的第二次编辑,您不能将填充条件放入 find 方法中,如何将条件放入填充中,您可以按照 answer1answer2 进行操作

    【讨论】:

    • 谢谢。我有另一个查询,我有用户文档,其中有角色对象 ID 数组。我正在写这个查询。我希望所有在库存、交付、帐户中具有角色的用户。 const doc = await User.find({ "roles.name": {$in :["Inventory Manager","Delivery Manager","Account Manager"]} }).populate("roles");
    • 这是返回空数组
    • 如果没有看到您的架构,我无法预测。
    • 您能否确认此数据并查询其正确与否mongoplayground.net/p/laQGSunXwWF,或者请提供所有收集的数据
    • 您现在可以确认this。第二种方式,如果你喜欢this
    猜你喜欢
    • 2018-06-30
    • 2012-07-06
    • 2018-09-10
    • 1970-01-01
    • 2023-03-30
    • 2018-07-06
    • 2016-02-14
    • 1970-01-01
    • 2013-11-23
    相关资源
    最近更新 更多