mongodb Product Filter not working mongoose,can't fetch products

euoag5mw  于 2023-11-17  发布在  Go
关注(0)|答案(2)|浏览(141)
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 }
);

的数据

798qvoo8

798qvoo81#

要访问category.name,您需要使用populate方法。然而,由于您使用的是引用文档,这对您的模式来说是一个非常好的设计,不幸的是,这意味着您不能根据文档中引用的子文档的条件来过滤父文档。
一般来说,没有办法让populate()根据故事作者的属性来过滤故事。例如,下面的查询不会返回任何结果,即使作者被填充。如果你想根据作者的名字过滤故事,你应该使用反规范化。
幸运的是,您可以使用aggregate()来获得您需要的内容。
mongoose Model.aggregate方法允许你传递mongodb aggregation pipeline stages。这可以在你的例子中使用它们引用的Category文档填充所有的Product文档。然后一旦它们被嵌入,你就可以像这样在category.name上匹配:

const products = await Product.aggregate([
  {
    $match: { //< Find the products that match your title search
      "title": title 
    }
  },
  {
    $lookup: {  //< Now populate the categories
      from: "categories", 
      localField: "category",
      foreignField: "_id",
      as: "category"
    }
  },
  {
    $match: { //< Only return matches on the category.name
      "category.name": categ
    }
  }
]);

字符串
请参阅HERE以获得一个工作示例,其中用户从name:'Mens'Category中搜索Producttitle:'Hat'

whitzsjs

whitzsjs2#

我认为你可以使用populate来从你的查询中获取值。只需按照下面的方式更新查询。

const products = await Product.find({ title:title}).populate({
     path:"category" , //name of foriegn table field here category in your productSchema
     match : { "name" : "value"} // name of the field in categorySchema 
})

字符串
或者你可以使用聚合管道解决,但我认为填充将是更有效的解决问题的方法。你也可以定义虚拟填充,使您的任务更容易。
参考similer Question

相关问题