node.js - 按引用属性(不是 id)查找文档
问题描述
我想在一个数组中找到属于一个类别的所有产品,即
我有这个类别的文件:
{
"_id" : ObjectId("5fa006c9e8c8633bd00dc9bf"),
"name" : "Beer"
"__v" : 0
}
{
"_id" : ObjectId("5fa3f6a69a55a4294815d333"),
"name" : "Gin"
"__v" : 0
}
和三个这样的产品:
{
"_id" : ObjectId("5fc5ba87d5b8e358888e976f"),
"code" : "CER473HEIN",
"category" : ObjectId("5fa006c9e8c8633bd00dc9bf"),
"__v" : 0
}
{
"_id" : ObjectId("6011e4d83408972b34fd048f"),
"code" : "GIN700BEEF",
"category" : ObjectId("5fa3f6a69a55a4294815d333"),
}
{
"_id" : ObjectId("6011e4f73408972b34fd0492"),
"code" : "GIN700GORD",
"category" : ObjectId("5fa3f6a69a55a4294815d333"),
}
如果在请求的正文中,我发送一个这样的数组:
{ 类别 = ['啤酒', '杜松子酒']` }
我想获得所有三种产品,但如果我只发送“啤酒”,我只想获得“啤酒”类别的产品。
我在产品的服务层尝试过这样的事情:
let getProductsByCategories = (req, res) => {
const { categories } = req.body;
Product.find({ 'category.name' : { $in: categories }})
.exec((err, productos) => {
if (err) {
return res.status(500).json({
ok: false,
error: 'Error interno en el servidor'
});
}
if (!productos) {
return res.status(400).json({
ok: false,
error: {
message: 'No se encontraron productos.'
}
});
}
res.json({
ok: true,
cantidad: productos.length,
entidadResultante: productos
});
})
}
IE:
但它总是返回 0 个产品,类别为 6 个产品。知道为什么会这样吗?泰。
解决方案
如果您ref
在模式中使用,您可以使用填充,但没有ref
您应该编写两个查询,首先获取 Id 的类别列表,req.body.categories
然后您可以获得产品列表
let getProductsByCategories = (req, res) => {
const { categories } = req.body;
Category.find({ 'category.name' : { $in: categories }})
.exec((err, categoryID) => {
if (err) {
return res.status(500).json({
ok: false,
error: 'Error interno en el servidor'
});
}
if (!categoryID) {
return res.status(400).json({
ok: false,
error: {
message: 'categoryID'
}
});
}
let listOfIds = categoryID.map(item => item._id)
Product.find({ 'category' : { $in: listOfIds }})
.exec((err, productos) => {
res.json({
ok: true,
cantidad: productos.length,
entidadResultante: productos
});
})
})
}
如果您在架构中使用 ref,请尝试这样:
Product.find()
.populate({
path: "category",
match: {
"category.name": { $in: categories },
},
})
.exec(function (err, productos) {
console.log(productos);
});
};
推荐阅读
- react-native - 在 Android 上反应原生地图标记
- python - CountVectorizer 给出的计数不同于手动计数
- r - 执行一个方程,产生一个新列
- php - 在控制器中挂钩 laravel 观察者
- algorithm - 3 种类型的二叉树遍历(前序、中序、后序)在现实生活中是如何使用的?
- javascript - RXJS 将单个 observable 转换为 observable 数组
- django-forms - 如何自定义 Django TimeField()?
- mongodb - mongo 更新查询不适用于旧版本
- javascript - 如何使用带有钩子的 react-native-action-sheet
- sql - 有没有办法在不使用 CTE 的情况下进行递归 SQL 查询?