Mongodb 猫鼬群居

Mongodb 猫鼬群居,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有用户文档和类别文档,它们连接到商店文档,看起来像 var ShopSchema = mongoose.Schema( { shopName: { type: String, required: [true, 'A Shop must have name'], }, phone: { type: String, validate: [validator.isMobilePhone,"Phone n

我有用户文档和类别文档,它们连接到商店文档,看起来像

  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);
  
现在,我正在编写一个查询,以使用填充的Manager和Category数据获取Manager shop(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"}
                  }
                ]
    }
    .....
    .....
在这里查找示例数据 商店- 由两个用户创建的3个店铺 用户- 类别-

有两个修复程序

  • 在第二次查找中,您在localField中没有
    shopCategory
    字段,因为您没有在
    $group
    中定义
    shopCategory
  • 在用户集合的第一次查找中,没有
    managerId
    字段,并且您已在
    \u id
    字段中分配了,然后您可以在localField中使用
    \u id
更新问题后更新内容



对于第二次编辑,您不能在“查找方法”中为“填充”设置条件,如何在“填充”中设置条件,您可以按照和

进行操作。谢谢。我还有另一个查询“我有一个用户文档”,它具有一组对象ID。我正在写这个问题。我希望所有用户都在库存、交付和帐户中扮演角色。const doc=wait User.find({“roles.name”:{$in:[“库存经理”、“交货经理”、“客户经理”]})。填充(“角色”);这是返回空数组如果不查看您的架构,我无法预测。您是否可以确认此数据并查询其是否正确,或者请提供所有集合的数据您是否可以立即确认。如果你愿意,第二条路
{ 
  $group: {
    _id:'$managerId',
    numofShop: {$sum: 1},
    shopCategory: { $first: "$shopCategory" } // define here
  }
},
{
  $lookup: {
    from: "User",
    localField : "_id", // change this from managerId
    foreignField: "_id",
    as: "Manager"
  }
},