const mongoose = require("mongoose");
const { ObjectId } = mongoose.Schema;
const productSchema = new mongoose.Schema(
{
title: {
type: String,
trim: true,
required: true,
maxlength: 32,
text: true,
},
category: {
type: ObjectId,
ref: "Category",
},
)
字符串
我特灵根据类别名称过滤产品,但cateogry本身是一个不同的集合。我如何正确应用过滤条件,因为当前的过滤条件不起作用。
const products = await Product.find({ title:title, "category.name": categ})
const categorySchema = new mongoose.Schema(
{
name: {
type: String,
trim: true,
required: "Name is required",
minlength: [2, "Too short"],
maxlength: [32, "Too long"],
},
{ timestamps: true }
);
的数据
2条答案
按热度按时间798qvoo81#
要访问
category.name
,您需要使用populate方法。然而,由于您使用的是引用文档,这对您的模式来说是一个非常好的设计,不幸的是,这意味着您不能根据文档中引用的子文档的条件来过滤父文档。一般来说,没有办法让populate()根据故事作者的属性来过滤故事。例如,下面的查询不会返回任何结果,即使作者被填充。如果你想根据作者的名字过滤故事,你应该使用反规范化。
幸运的是,您可以使用
aggregate()
来获得您需要的内容。mongoose Model.aggregate方法允许你传递mongodb aggregation pipeline stages。这可以在你的例子中使用它们引用的
Category
文档填充所有的Product
文档。然后一旦它们被嵌入,你就可以像这样在category.name
上匹配:字符串
请参阅HERE以获得一个工作示例,其中用户从
name:'Mens'
的Category
中搜索Product
title:'Hat'
。whitzsjs2#
我认为你可以使用populate来从你的查询中获取值。只需按照下面的方式更新查询。
字符串
或者你可以使用聚合管道解决,但我认为填充将是更有效的解决问题的方法。你也可以定义虚拟填充,使您的任务更容易。
参考similer Question