MongoDB $lookup 返回空数组

问题描述 投票:0回答:1

产品系列:

[
        {
            "isActive": true,
            "_id": "643bbdee68b521035e20c976",
            "name": "lu",
            "price": 123,
            "userId": "643abd0dcce4df3b1a0c8fa7"
        },
         {
            "_id": "643bbdd668b521035e20c972",
            "name": "mu",
            "price": 123,
            "userId": "643abd0dcce4df3b1a0c8fa7",
            "isActive": true,
            "__v": 0
        },
         {
            "isActive": true,
            "_id": "643bbdbc68b521035e20c971",
            "name": "nu",
            "price": 123,
            "userId": "643abd0dcce4df3b1a0c8fa7"
        },
         {
            "_id": "643c2dc126211992b4ee8fd5",
            "name": "pu",
            "price": 123,
            "userId": "643abd0dcce4df3b1a0c8fa7",
            "isActive": true
        }
    ]

子产品集合:

[
        {
            "_id": "643d7ed82cd5b5fcd7e81e02",
            "name": "kkkk",
            "phoneNum": 9543922499,
            "productID": "643bbdee68b521035e20c976",
            "user": "643abd0dcce4df3b1a0c8fa7",
            "address": {
                "address1": "243, bastin nagarsss",
                "zipCode": 6250185
            }
        }
    ]

我的聚合函数:

aggregateLookup: async () => {
    try {
        let subProduct = await SubProduct.aggregate([
            {
                $lookup: {
                    from: "Product",
                    localField: "productID",
                    foreignField: "_id",
                    as: "product_Details"
                }
            }
        ]);

        return subProduct;
    } catch (error) {
        throw new Error(error);
    }
}

我的架构:

const subProduct = new mongoose.Schema({
  name: {
    type: String,
    required: [true,'Name is Required...']
  },
  phoneNum: {
    type: Number,
    required: true,
    validate: {
      validator: (value) => {
        return `${value}`.length === 10;
      },
      message: 'Should be 10 digit Number'
    }
  },
  productID: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'Product'
  },
  user: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'User'
  },
  address: {
    address1: String,
    zipCode: Number
  }
});

在架构中,我将产品 ID 类型设置为 ObjectID。在 aggregateLookup 函数中,我需要使用 $lookup 检索所有数据,我在产品文档中有相关产品,但它仍然返回一个空数组。

我的输出是 Product_Details 为空但在产品文档中有数据:

[
    {
        "_id": "643d7ed82cd5b5fcd7e81e02",
        "name": "kkkk",
        "phoneNum": 9543922499,
        "productID": "643bbdee68b521035e20c976",
        "user": "643abd0dcce4df3b1a0c8fa7",
        "address": {
            "address1": "243, bastin nagarsss",
            "zipCode": 6250185
        },
        "product_Details": []
    }
]

预期产出:

[
    {
        "_id": "643d7ed82cd5b5fcd7e81e02",
        "name": "kkkk",
        "phoneNum": 9543922499,
        "productID": "643bbdee68b521035e20c976",
        "user": "643abd0dcce4df3b1a0c8fa7",
        "address": {
            "address1": "243, bastin nagarsss",
            "zipCode": 6250185
        },
        "product_Details": [
        {
        "isActive": true,
        "_id": "643bbdee68b521035e20c976",
        "name": "lu",
        "price": 123,
        "userId": "643abd0dcce4df3b1a0c8fa7"
        }
        ]
    }
]

请帮助我我犯了什么错误我是 mongodb 的新手。提前致谢...

mongodb mongoose mongoose-schema
1个回答
3
投票

问题肯定出在集合的名称上。

您使用了

from:"Product"
而不是您需要使用
products
这个词,因为您需要提供在数据库中形成的集合的确切名称。因为 mongoDB 会自动为集合名称分配多个单词。您可以通过转到 mongosh shell 和

来检查集合名称
  1. 显示所有数据库的列表
    show dbs
  2. 使用数据库名称
    use db_name
  3. 列出收藏品
    show collections

https://mongoplayground.net/p/_bp4jpzUHVg

我这里测试过

© www.soinside.com 2019 - 2024. All rights reserved.