简体   繁体   English

我的 api 代码从 mongodb 检索空数据数组,而代码在 mongodb 操场上运行良好

[英]My api code retrieves an empty data array from mongodb while the code works well on mongodb playground

My mongodb database includes a collection of users and each user has an array of shops and each shop has an array of products.我的 mongodb 数据库包含一组用户,每个用户都有一系列商店,每个商店都有一系列产品。 Here is a simplified version of my collection structure:这是我的收藏结构的简化版本:

[
    {
        "_id": "60e66b70da2439232e330415",
        "name": "User1 Name",
        "shops": [
            {
                "_id": "60e7c9e2be0d8f03544a03b8",
                "shopName": "User1 Shop1 Name",
                "products": [
                    {
                        "_id": "60e9e9e8105d6021a2e91535",
                        "title": "User1 Shop1 Product1 Title"
                    },
                    {
                        "_id": "60e9f4a0105d6021a2e91536",
                        "title": "User1 Shop1 Product2 Title"
                    }
                ]
            },
            {
                "_id": "60e8e8c00f3986577cb968c9",
                "shopName": "User1 Shop2 Name",
                "products": [
                    {
                        "_id": "60e9f4fe105d6021a2e91537",
                        "title": "User1 Shop2 Product1 Title"
                    },
                    {
                        "_id": "60e9f515105d6021a2e91538",
                        "title": "User1 Shop2 Product2 Title"
                    }
                ]
            }
        ]
    },
    {
        "_id": "60e66b93da2439232e330416",
        "name": "User2 Name",
        "shops": [
            {
                "_id": "60e69698e76cad44e49e1fc8",
                "shopName": "User2 Shop1 Name",
                "products": [
                    {
                        "_id": "60e9f588105d6021a2e91539",
                        "title": "User2 Shop1 Product1 Title"
                    },
                    {
                        "_id": "60e9f59c105d6021a2e9153a",
                        "title": "User2 Shop1 Product2 Title"
                    }
                ]
            },
            {
                "_id": "60e902b441e9df63c7fbcb49",
                "shopName": "User2 Shop2 Name",
                "products": [
                    {
                        "_id": "60e9f5c9105d6021a2e9153b",
                        "title": "User2 Shop2 Product1 Title"
                    },
                    {
                        "_id": "60e9f5de105d6021a2e9153c",
                        "title": "User2 Shop2 Product2 Title"
                    }
                ]
            }
        ]
    }
]

I have an api endpoint like .../api/products/60e9f5de105d6021a2e9153c .我有一个像.../api/products/60e9f5de105d6021a2e9153c这样的 api 端点。 This endpoint includes a parameter which is a productId.此端点包含一个参数,即 productId。 I have the following two codes to retrieve the product data from my mongodb collection, but the retrieved array is empty.我有以下两个代码来从我的 mongodb 集合中检索产品数据,但检索到的数组为空。

My endpoint code:我的端点代码:

app.get("/api/products/:productId", (req,res)=>{
    let productId = req.params.productId;
    myData.getProductByProductId(productId)
    .then(products => res.json(products))
    .catch(err => res.json({"message": err}));
});

My DataService code:我的数据服务代码:

getProductByProductId: function (productId) {
            return new Promise((resolve, reject) => {
                User.aggregate([
                    {
                      $match: {
                        "shops.products._id": productId
                      }
                    },
                    {
                      "$unwind": "$shops"
                    },
                    {
                      "$unwind": "$shops.products"
                    },
                    {
                      $match: {
                        "shops.products._id": productId
                      }
                    },
                    {
                      $project: {
                        "_id": "$shops.products._id",
                        "title": "$shops.products.title"
                      }
                    }
                  ])
                .exec().then(products => {
                    resolve(products)
                }).catch(err => {
                    reject(err);
                });
            });
        }

The aggregate code works well in this playground but in my web app code retrieves an empty array.聚合代码在这个操场上运行良好,但在我的网络应用程序代码中检索一个空数组。

Turns out the casting of the ObjectId seemed to be the issue.结果证明 ObjectId 的转换似乎是问题所在。 We need to use mongoose.Types.ObjectId我们需要使用mongoose.Types.ObjectId

The API code will looks like this API 代码如下所示

getProductByProductId: function (productId) {
return new Promise((resolve, reject) => {
  User.aggregate([
  {
  $match: {
    "shops.products._id": mongoose.Types.ObjectId(productId)
  }
  },
  {
    "$unwind": "$shops"
  },
  {
    "$unwind": "$shops.products"
  },
  {
    $match: {
    "shops.products._id": mongoose.Types.ObjectId(productId)
  }
  },
  {
  $project: {
  "_id": "$shops.products._id",
  "title": "$shops.products.title"
  }
}
])
.then(products => {
resolve(products)
}).catch(err => {
reject(err);
});
});
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM